v2.5.2
Giriş yap

PHP'de sayfa içinde sayfa çağırdımda Tippy.js çalışmıyor

ebuword
215 defa görüntülendi

Merhaba, movie.php sayfamda sayfa ilk başladığında 20 yorum ve sayfa kaydırıldıkça yeni yorumlar eklenecek şekilde düzenledim. Php bilmediğim için ChatGPT ile yapıyorum ama bazen takılıyor ve yapamıyor.

Tüm kodlar çok fazla uzun olduğu için sadece belli yerleri atacağım.

Aşağıdaki kodda movie.php dosyasındaki yorumlar kısmım var.

        <!-- Yorumlar -->
        <div class="mb-8 comments-container">
            <h2 class="text-2xl font-semibold mb-4">Yorumlar</h2>
            <?php if ($userLoggedIn) : ?>
                <form action="add_comment.php" method="POST" class="mb-4">
                    <input type="hidden" name="movie_id" value="<?= htmlspecialchars($movieId); ?>">
                    <textarea name="content" class="w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="Yorumunuzu buraya yazın..." required></textarea>
                    <button type="submit" class="mt-2 px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition duration-300 focus:outline-none">Yorum
                        Ekle</button>
                </form>
            <?php else : ?>
                <p class="mb-4"><a href="login.php" class="text-blue-500 hover:underline">Giriş yapın</a> veya <a href="register.php" class="text-blue-500 hover:underline">kaydolun</a> yorum yapmak için.</p>
            <?php endif; ?>

            <?php foreach ($comments as $comment) : ?>
                <div class="bg-white shadow-md rounded-lg p-4 mb-4">
                    <div class="flex items-center mb-2">
                        <img src="<?= htmlspecialchars($comment['profile_picture']); ?>" alt="<?= htmlspecialchars($comment['username']); ?>" class="w-10 h-10 rounded-full mr-2">
                        <div>
                            <div class="flex items-center">
                                <a href="profile.php?user_id=<?= $comment['user_id']; ?>" class="font-bold"><?= htmlspecialchars($comment['username']); ?></a>
                                <p class="text-blue-500/50 bg-blue-100 rounded px-2 border border-blue-500/10 text-sm ml-1">
                                    <?= $comment['comment_count']; ?> yorum</p>
                                <?php
                                // Check if the user has badges and display them
                                $userBadges = getUserBadges($comment['user_id']);
                                foreach ($userBadges as $badge) : ?>
                                    <img src="<?= htmlspecialchars($badge['badge_icon']); ?>" alt="<?= htmlspecialchars($badge['badge_name']); ?>" data-tippy-content="<?= htmlspecialchars($badge['badge_description']); ?>" class="w-5 h-5 ml-2 cursor-pointer">
                                <?php endforeach; ?>
                            </div>
                            <p class="text-gray-500 text-sm">
                                <?= date('d F Y - H:i', strtotime($comment['timestamp'])); ?></p>
                        </div>
                    </div>
                    <p><?= nl2br(htmlspecialchars($comment['content'])); ?></p>
                    <?php if ($userLoggedIn && $_SESSION['user_id'] === $comment['user_id']) : ?>
                        <div class="mt-2">
                            <a href="edit_comment.php?comment_id=<?= $comment['id']; ?>" class="text-blue-500 hover:underline">Düzenle</a> |
                            <a href="movie.php?id=<?= $movieId; ?>&action=delete&comment_id=<?= $comment['id']; ?>" class="text-red-500 hover:underline" onclick="return confirm('Yorumu silmek istediğinizden emin misiniz?')">Sil</a>
                        </div>
                    <?php endif; ?>
                    <?php if ($comment['edited'] == 1) : ?>
                        <p class="text-xs text-gray-400 mt-2">Bu yorum düzenlendi.</p>
                    <?php endif; ?>
                </div>
            <?php endforeach; ?>
        </div>

        <div id="comments-container">
            <!-- Buraya yüklenen yorumlar eklenecek -->
        </div>

Bu da load_comments.php dosyam. Yeni eklenen yorumları AJAX ile alıyor sanırım fazla bilgim yok.

<?php
session_start();

// Veritabanı bağlantısı ve diğer gerekli dosyaları dahil etme
require 'db.php'; // Veritabanı bağlantısı
require 'tmdb.php'; // TMDb API işlevleri

// Fonksiyon: Kullanıcı rozetleri
function getUserBadges($userId)
{
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM badges WHERE user_id = :user_id");
    $stmt->execute(['user_id' => $userId]);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

// Sayfa numarası ve yüklenecek yorum sayısını al
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1;
$commentsPerPage = 20; // Her sayfada gösterilecek yorum sayısı

// Başlangıç noktasını hesapla
$start = ($page - 1) * $commentsPerPage;

// Yorumları ve kullanıcı başına toplam yorum sayısını getirme
$stmt = $pdo->prepare("
    SELECT 
        comments.id, 
        users.id AS user_id, 
        users.username, 
        users.profile_picture, 
        users.verified, 
        comments.content, 
        comments.timestamp,
        comments.edited,
        (SELECT COUNT(*) FROM comments WHERE user_id = users.id) AS comment_count 
    FROM comments
    JOIN users ON comments.user_id = users.id
    WHERE comments.movie_id = :movie_id
    ORDER BY comments.timestamp DESC
    LIMIT :start, :commentsPerPage
");

$stmt->bindValue(':movie_id', $_GET['id'], PDO::PARAM_INT);
$stmt->bindValue(':start', $start, PDO::PARAM_INT);
$stmt->bindValue(':commentsPerPage', $commentsPerPage, PDO::PARAM_INT);
$stmt->execute();
$comments = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Yorumlar</title>
    <!-- tippy.js ve CSS dosyalarını CDN'den ekleyin -->
    <script src="https://unpkg.com/@popperjs/core@2"></script>
    <script src="https://unpkg.com/tippy.js@6"></script>
    <link rel="stylesheet" href="https://unpkg.com/tippy.js@6/dist/tippy.css">
</head>
<body>
<div id="comments-container">
    <?php foreach ($comments as $comment) : ?>
        <?php
        // Kullanıcı rozetlerini al
        $userBadges = getUserBadges($comment['user_id']);
        ?>
        <div class="bg-white shadow-md rounded-lg p-4 mb-4">
            <div class="flex items-center mb-2">
                <img src="<?= htmlspecialchars($comment['profile_picture']); ?>"
                    alt="<?= htmlspecialchars($comment['username']); ?>"
                    class="w-10 h-10 rounded-full mr-2">
                <div>
                    <div class="flex items-center">
                        <a href="profile.php?user_id=<?= $comment['user_id']; ?>"
                            class="font-bold"><?= htmlspecialchars($comment['username']); ?></a>
                        <p class="text-blue-500/50 bg-blue-100 rounded px-2 border border-blue-500/10 text-sm ml-1">
                            <?= $comment['comment_count']; ?> yorum</p>
                        <?php foreach ($userBadges as $badge) : ?>
                            <img src="<?= htmlspecialchars($badge['badge_icon']); ?>"
                                alt="<?= htmlspecialchars($badge['badge_name']); ?>"
                                data-tippy-content="<?= htmlspecialchars($badge['badge_description']); ?>"
                                class="w-5 h-5 ml-2 cursor-pointer" data-tippy-placement="top">
                        <?php endforeach; ?>
                    </div>
                    <p class="text-gray-500 text-sm">
                        <?= date('d F Y - H:i', strtotime($comment['timestamp'])); ?></p>
                </div>
            </div>
            <p><?= nl2br(htmlspecialchars($comment['content'])); ?></p>
            <?php if ($_SESSION['user_id'] === $comment['user_id']) : ?>
                <div class="mt-2">
                    <a href="edit_comment.php?comment_id=<?= $comment['id']; ?>"
                        class="text-blue-500 hover:underline">Düzenle</a> |
                    <a href="movie.php?id=<?= $_GET['id']; ?>&action=delete&comment_id=<?= $comment['id']; ?>"
                        class="text-red-500 hover:underline"
                        onclick="return confirm('Yorumu silmek istediğinizden emin misiniz?')">Sil</a>
                </div>
            <?php endif; ?>
            <?php if ($comment['edited'] == 1) : ?>
                <p class="text-xs text-gray-400 mt-2">Bu yorum düzenlendi.</p>
            <?php endif; ?>
        </div>
    <?php endforeach; ?>
</div>

<!-- tooltip.js dosyasını modül olarak yükleyin -->
<script src="tooltip.js" type="module"></script>
</body>
</html>
trsherlock
133 gün önce

Bir de react örneği hazırladım. Herhangi bir html dosyasına yapıştırıp çalıştırabilirsin.

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    
</head>
<body>
    <div id="root" class="container"></div>
    <script type="text/babel">
      const { useState, useEffect } = React;
      function App() {
            const [users, setUsers] = useState([]);
            const [userId, setUserId] = useState(1);
            const [comments, setComments] = useState([]);
            const handleUsers = async ()=>{
                const result = await fetch("https://jsonplaceholder.typicode.com/users").then(d=>d.json())
                setUsers(result);
            };
            const handleComments = async ()=>{
                const result = await fetch(`https://jsonplaceholder.typicode.com/posts/${userId}/comments`).then(d=>d.json())
                
                if(userId != users.length){
                    setComments([...comments, ...result]);
                    setUserId(prev=>prev+1);
                }
            }
            useEffect(()=>{
                handleUsers();
            }, [])
            return (
                <div>
                    <ul>
                        {
                            comments.map((line,k)=>(
                                <li key={k}>{line.body}</li>
                            ))
                        }
                    </ul>
                    <button onClick={handleComments}>Yükle</button>
                </div>
            );
        }
        const root = ReactDOM.createRoot(document.getElementById("root"));
        root.render(<App />)
  </script>
</body>
</html>