اذهب إلى المحتوى

السؤال

نشر (معدل)

اريد اضافة منتدى طقس في موقعي الكود الخلفي جاهز لكن الواجهة ليست جاهزة لان لغاية الان لم اجد تصميم مناسب للكود التالي 

<?php
// public/post.php
require_once '';
require_once '';

$post_id = $_GET['id'];

$stmt = $conn->prepare("SELECT posts.*, users.username, users.profile_image, (SELECT COUNT(*) FROM likes WHERE likes.post_id = posts.id) as like_count FROM posts JOIN users ON posts.user_id = users.id WHERE posts.id = :id");
$stmt->bindParam(':id', $post_id);
$stmt->execute();
$post = $stmt->fetch(PDO::FETCH_ASSOC);

$stmt = $conn->prepare("SELECT comments.*, users.username FROM comments JOIN users ON comments.user_id = users.id WHERE post_id = :post_id ORDER BY parent_id ASC, created_at DESC");
$stmt->bindParam(':post_id', $post_id);
$stmt->execute();
$comments = $stmt->fetchAll(PDO::FETCH_ASSOC);

$stmt = $conn->prepare("SELECT COUNT(*) FROM likes WHERE post_id = :post_id AND user_id = :user_id");
$stmt->bindParam(':post_id', $post_id);
$stmt->bindParam(':user_id', $_SESSION['user_id']);
$stmt->execute();
$hasLiked = $stmt->fetchColumn();

date_default_timezone_set('Asia/Damascus');

if ($_SERVER["REQUEST_METHOD"] == "POST" && isLoggedIn()) {
    if (isset($_POST['comment'])) {
        $comment = base64_encode($_POST['comment']);
        $user_id = $_SESSION['user_id'];
        $parent_id = isset($_POST['parent_id']) ? $_POST['parent_id'] : null;

        $stmt = $conn->prepare("INSERT INTO comments (post_id, user_id, comment, parent_id) VALUES (:post_id, :user_id, :comment, :parent_id)");
        $stmt->bindParam(':post_id', $post_id);
        $stmt->bindParam(':user_id', $user_id);
        $stmt->bindParam(':comment', $comment);
        $stmt->bindParam(':parent_id', $parent_id);

        if ($stmt->execute()) {
            echo json_encode(['success' => true]);
            exit();
        } else {
            echo json_encode(['success' => false]);
            exit();
        }
    } elseif (isset($_POST['like'])) {
        if (!$hasLiked) {
            $user_id = $_SESSION['user_id'];

            $stmt = $conn->prepare("INSERT INTO likes (post_id, user_id) VALUES (:post_id, :user_id)");
            $stmt->bindParam(':post_id', $post_id);
            $stmt->bindParam(':user_id', $user_id);

            if ($stmt->execute()) {
                echo json_encode(['success' => true]);
                exit();
            } else {
                echo json_encode(['success' => false]);
                exit();
            }
        } else {
            echo json_encode(['success' => false, 'message' => 'لقد قمت بالإعجاب بالفعل.']);
            exit();
        }
    }
}

function renderComments($comments, $parent_id = null) {
    $html = '';
    foreach ($comments as $comment) {
        if ($comment['parent_id'] == $parent_id) {
            $html .= '<div class="comment">';
            $html .= '<div class="user-info"><img src="user.jpg" alt="User Image"><p>بواسطة ' . htmlspecialchars($comment['username']) . ' في ' . date("Y-m-d H:i:s", strtotime($comment['created_at'])) . '</p></div>';
            $html .= '<p>' . htmlspecialchars(base64_decode($comment['comment'])) . '</p>';
            $html .= '<button class="btn reply-button" data-comment-id="' . $comment['id'] . '">رد</button>';
            $html .= '<div class="replies">';
            $html .= renderComments($comments, $comment['id']);
            $html .= '</div>';
            $html .= '<div class="reply-form"></div>';
            $html .= '</div>';
        }
    }
    return $html;
}
?>
<!DOCTYPE html>
<html lang="ar">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>عرض المنشور</title>
    <link rel="stylesheet" href="styles.css">
  <style>
    body {
        background-color: #f2f2f2;
        color: #333;
        font-family: Arial, sans-serif;
        margin: 0;
        padding: 0;
    }

    .container {
        width: 100%;
        max-width: 1200px;
        margin: 20px auto;
        display: flex;
        flex-direction: column;
        align-items: center;
    }

    .post {
        background-color: #fff;
        padding: 20px;
        margin: 0 auto 20px auto;
        border: 1px solid #ddd;
        border-radius: 8px;
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        width: 100%;
        max-width: 800px;
        box-sizing: border-box;
    }

    .post h2 {
        color: #333;
        margin-top: 0;
    }

    .post p {
        color: #555;
        line-height: 1.6;
    }

    .user-info {
        display: flex;
        align-items: center;
        margin-top: 10px;
    }

    .user-info img {
        width: 40px;
        height: 40px;
        border-radius: 50%;
        margin-right: 10px;
    }

    .user-info p {
        margin: 0;
        color: #666;
        font-size: 14px;
    }
.post { background-color: #fff; /* لون خلفية المنشور */ padding: 20px; margin: 0 -20px; /* تعديل هنا لجعل المنشور يمتد للحافات */ border: 1px solid #ddd; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); width: calc(100% + 40px); /* إضافة الهامشين لتعويض الحواف */ max-width: 800px; /* تعيين عرض أقصى للمنشور */ box-sizing: border-box; }
    .like-form .btn,
    .add-comment-btn,
    .btn {
        background-color: #007bff;
        color: #fff;
        border: none;
        padding: 8px 16px;
        cursor: pointer;
        border-radius: 4px;
        transition: background-color 0.3s ease;
    }

    .like-form .btn:hover,
    .add-comment-btn:hover,
    .btn:hover {
        background-color: #0056b3;
    }

    .comments-popup {
        display: none;
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background-color: rgba(0, 0, 0, 0.5);
        justify-content: center;
        align-items: center;
        z-index: 1000;
    }

    .comments-popup.active {
        display: flex;
    }

    .content {
        background-color: #fff;
        padding: 20px;
        border-radius: 8px;
        width: 80%;
        max-width: 600px;
        position: relative;
    }

    .close {
        position: absolute;
        top: 10px;
        right: 10px;
        font-size: 24px;
        cursor: pointer;
        color: #333;
        border: none;
        background-color: transparent;
    }

    .close:hover {
        color: #0056b3;
    }

    .comments {
        margin-top: 20px;
    }

    .comment {
        background-color: #f9f9f9;
        border-radius: 4px;
        padding: 10px;
        margin-bottom: 10px;
        position: relative;
    }

    .comment p {
        margin: 0;
        color: #555;
        font-size: 14px;
    }

    .comment .user-info p {
        color: #666;
        font-size: 14px;
    }

    .comment .more-options .options-menu {
        right: -20px;
        min-width: 120px;
        background-color: #fff;
        border: 1px solid #ddd;
        border-radius: 4px;
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
        z-index: 1;
    }

    .comment .more-options .options-menu.active {
        display: block;
    }

    .comment .more-options .options-menu button {
        background-color: transparent;
        border: none;
        padding: 10px;
        cursor: pointer;
        text-align: left;
        width: 100%;
        font-size: 14px;
        color: #333;
    }

    .comment .more-options .options-menu button:hover {
        background-color: #f0f0f0;
    }

    .replies {
        margin-top: 10px;
    }

    .reply-form {
        display: none;
        margin-top: 10px;
    }

    .reply-form.active {
        display: flex;
    }

    .reply-form textarea {
        width: calc(100% - 80px);
        padding: 10px;
        font-size: 16px;
        border: 1px solid #ccc;
        border-radius: 4px;
        resize: vertical;
    }

    .reply-form .btn {
        background-color: #007bff;
        color: #fff;
        border: none;
        padding: 8px 16px;
        cursor: pointer;
        border-radius: 4px;
        transition: background-color 0.3s ease;
    }

    .reply-form .btn:hover {
        background-color: #0056b3;
    }

    .error {
        color: red;
        font-size: 14px;
        margin-top: 10px;
    }

    .more-options {
        position: relative;
        display: inline-block;
    }

    .more-options .btn {
        background-color: transparent;
        border: none;
        cursor: pointer;
        padding: 8px;
    }

    .more-options .options-menu {
        display: none;
        position: absolute;
        top: 100%;
        right: 0;
        background-color: #fff;
        border: 1px solid #ddd;
        border-radius: 4px;
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
        z-index: 1;
    }

    .more-options .options-menu.active {
        display: block;
    }

    .more-options .options-menu button {
        background-color: transparent;
        border: none;
        padding: 10px;
        cursor: pointer;
        text-align: left;
        width: 100%;
        font-size: 14px;
        color: #333;
    }

    .more-options .options-menu button:hover {
        background-color: #f0f0f0;
    }

    @media screen and (max-width: 768px) {
        .container {
            padding: 10px;
        }

        .post {
            padding: 15px;
            margin-bottom: 15px;
        }

        .content {
            width: 100%;
            padding: 15px;
        }
    }
</style>

</head>
<body>
    <div class="container">
        <div class="post">
            <h2><?php echo htmlspecialchars(base64_decode($post['title'])); ?></h2>
            <p><?php echo htmlspecialchars(base64_decode($post['content'])); ?></p>
            <?php if ($post['image']): ?>
                <img src="data:image/jpeg;base64,<?php echo base64_encode($post['image']); ?>" alt="Post Image" class="post-image">
            <?php endif; ?>
            <div class="user-info">
                <?php if ($post['profile_image']): ?>
                    <img src="data:image/jpeg;base64,<?php echo base64_encode($post['profile_image']); ?>" alt="User Image">
                <?php endif; ?>
                <p>بواسطة <?php echo htmlspecialchars($post['username']); ?> في <?php echo date("Y-m-d H:i:s", strtotime($post['created_at'])); ?><?php if ($post['updated_at']): ?> (معدل)<?php endif; ?></p>
            </div>
            <p>إعجابات: <span id="like-count"><?php echo $post['like_count']; ?></span></p>
        </div>

        <?php if (isLoggedIn()): ?>
            <div class="like-form">
                <button class="btn" id="like-button" <?php if ($hasLiked) echo 'disabled'; ?>>إعجاب</button>
            </div>
        <?php endif; ?>

        <button class="btn add-comment-btn" id="show-comments-btn">عرض التعليقات</button>

        <div class="comments-popup" id="comments-popup">
            <div class="content">
                <button class="close" id="close-comments-btn">&times;</button>
                <h3>التعليقات</h3>
                <div class="comments" id="comments-section">
                    <?php echo renderComments($comments); ?>
                </div>

                <?php if (isLoggedIn()): ?>
                    <div class="add-comment-form" id="add-comment-form">
                        <div class="form-group">
                            <textarea id="comment-text" placeholder="أضف تعليقك هنا..." required></textarea>
                        </div>
                        <button class="btn" id="comment-button">إرسال</button>
                    </div>
                    <button class="btn add-comment-btn" id="toggle-comment-form">إضافة تعليق</button>
                <?php else: ?>
                    <p>يجب أن <a href="login.php">تسجل الدخول</a> لتتمكن من إضافة تعليق.</p>
                <?php endif; ?>

                <p class="error" id="error-message"><?php if (isset($error)) echo $error; ?></p>
            </div>
        </div>
    </div>
<script>
    document.getElementById('like-button').addEventListener('click', function() {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "post.php?id=<?php echo $post_id; ?>", true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200) {
                var response = JSON.parse(xhr.responseText);
                if (response.success) {
                    var likeCount = document.getElementById('like-count');
                    likeCount.textContent = parseInt(likeCount.textContent) + 1;
                    document.getElementById('like-button').disabled = true;
                } else {
                    document.getElementById('error-message').textContent = response.message || "حدث خطأ ما. حاول مرة أخرى.";
                }
            }
        };
        xhr.send("like=true");
    });

    document.getElementById('comment-button').addEventListener('click', function() {
        var commentText = document.getElementById('comment-text').value;
        if (commentText.trim() === '') return;

        var xhr = new XMLHttpRequest();
        xhr.open("POST", "post.php?id=<?php echo $post_id; ?>", true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200) {
                var response = JSON.parse(xhr.responseText);
                if (response.success) {
                    var commentsSection = document.getElementById('comments-section');
                    var newComment = document.createElement('div');
                    newComment.classList.add('comment');
                    newComment.innerHTML = '<p>' + commentText + '</p><div class="user-info"><p>بواسطة <?php echo htmlspecialchars($_SESSION['username']); ?> في الآن</p></div>';
                    commentsSection.insertBefore(newComment, commentsSection.firstChild);
                    document.getElementById('comment-text').value = '';
                } else {
                    document.getElementById('error-message').textContent = response.message || "حدث خطأ ما. حاول مرة أخرى.";
                }
            }
        };
        xhr.send("comment=" + encodeURIComponent(commentText));
    });

    document.getElementById('toggle-comment-form').addEventListener('click', function() {
        var form = document.getElementById('add-comment-form');
        form.classList.toggle('active');
    });

    document.getElementById('show-comments-btn').addEventListener('click', function() {
        document.getElementById('comments-popup').style.display = 'flex';
    });

    document.getElementById('close-comments-btn').addEventListener('click', function() {
        document.getElementById('comments-popup').style.display = 'none';
    });

    document.querySelectorAll('.reply-button').forEach(function(button) {
        button.addEventListener('click', function() {
            var commentId = this.getAttribute('data-comment-id');
            var replyForm = document.createElement('div');
            replyForm.classList.add('reply-form');
            replyForm.innerHTML = `
                <textarea class="reply-text" required></textarea>
                <button class="btn submit-reply" data-comment-id="${commentId}">إرسال</button>
            `;
            this.parentElement.appendChild(replyForm);
            replyForm.style.display = 'flex';

            replyForm.querySelector('.submit-reply').addEventListener('click', function() {
                var replyText = replyForm.querySelector('.reply-text').value;
                if (replyText.trim() === '') return;

                var xhr = new XMLHttpRequest();
                xhr.open("POST", "post.php?id=<?php echo $post_id; ?>", true);
                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        var response = JSON.parse(xhr.responseText);
                        if (response.success) {
                            var repliesSection = button.nextElementSibling;
                            var newReply = document.createElement('div');
                            newReply.classList.add('comment');
                            newReply.innerHTML = '<p>' + replyText + '</p><div class="user-info"><p>بواسطة <?php echo htmlspecialchars($_SESSION['username']); ?> في الآن</p></div>';
                            repliesSection.insertBefore(newReply, repliesSection.firstChild);
                            replyForm.style.display = 'none';
                        } else {
                            document.getElementById('error-message').textContent = response.message || "حدث خطأ ما. حاول مرة أخرى.";
                        }
                    }
                };
                xhr.send("comment=" + encodeURIComponent(replyText) + "&parent_id=" + commentId);
            });
        });
    });

    document.querySelectorAll('.more-options').forEach(function(button) {
        button.addEventListener('click', function() {
            var optionsMenu = this.querySelector('.options-menu');
            optionsMenu.classList.toggle('active');
        });
    });

    document.addEventListener('click', function(event) {
        if (!event.target.closest('.more-options')) {
            document.querySelectorAll('.options-menu.active').forEach(function(menu) {
                menu.classList.remove('active');
            });
        }
    });
</script>
</body>
</html>

 

تم التعديل في بواسطة تمام عصام

Recommended Posts

  • 1
نشر
بتاريخ 1 دقيقة مضت قال تمام عصام:

انت لم ترى الكود الكود هو منتدى طقس لمشاركة حالة الطقس و تحليلات المستخدمين 

إطلعت على موقعك من قبل على منصة حسوب io و هو شغال، لكن تحتاج إلى إنقاص عدد المعلومات التي في الصفحة و لا تحتاج إلى وضع التفاصيل الخاصة بكل الأيام القادمة، و إنما فقط إعتمد على البساطة مثل الصورة التي أرسلت، بحيث تكون معلومات أكثر فقط على اليوم الحالي، و في حالة شخص ما أراد معلومات أكثر على الأيام القادمة يمكنه الضغط على اليوم ليتم عرض هذه التفاصيل.

  • 0
نشر

إختيار التصميم المناسب يعتمد بشكل أكبر على الثيم الخاص بالموقع يجب أن يكون ملائم للألوان التي هناك، و بالبحث عن تصميم جاهز ربما لن تجد ما يناسبك لذا أفضل شيء هو إنشاء تصميم خاص بك، يمكنك إستلهام الافكار من التصاميم السابقة و بعدها تصميم الواجهة بإستخدام موقع Figma،

كما أن مجال الأخبار تقريبا لديه نفس الواجهات التي تظهر درجات الحرارة مع إختلاف طفيف في الألوان مثل الصورة:

image.png.c7dfeeb0bebd3017ff2d3d8e65b2c187.png

لذا حاول جعله بهذه الطريقة مع التغيير في الألوان التي تناسب موقعك.

  • 0
نشر
بتاريخ 1 دقيقة مضت قال Chihab Hedidi:

إختيار التصميم المناسب يعتمد بشكل أكبر على الثيم الخاص بالموقع يجب أن يكون ملائم للألوان التي هناك، و بالبحث عن تصميم جاهز ربما لن تجد ما يناسبك لذا أفضل شيء هو إنشاء تصميم خاص بك، يمكنك إستلهام الافكار من التصاميم السابقة و بعدها تصميم الواجهة بإستخدام موقع Figma،

كما أن مجال الأخبار تقريبا لديه نفس الواجهات التي تظهر درجات الحرارة مع إختلاف طفيف في الألوان مثل الصورة:

image.png.c7dfeeb0bebd3017ff2d3d8e65b2c187.png

لذا حاول جعله بهذه الطريقة مع التغيير في الألوان التي تناسب موقعك.

انت لم ترى الكود الكود هو منتدى طقس لمشاركة حالة الطقس و تحليلات المستخدمين 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...