За последние 24 часа нас посетили 20594 программиста и 1008 роботов. Сейчас ищут 338 программистов ...

Как реализовать комментирование.

Тема в разделе "PHP для новичков", создана пользователем Dilon, 21 апр 2017.

  1. Dilon

    Dilon Активный пользователь

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Дайте пожалуйста хороший пример с реализацией комментирования. MVC, процедурный стиль.
     
  2. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Тут всё очень просто. Создаешь таблицу в БД с внешним ключом к коментируемому.
    Например, если это блог статей, то внешний ключ будет к таблице с самими статьями.
    Вытаскиваешь статью и все коментарии к этой статье по id.
     
  3. Dilon

    Dilon Активный пользователь

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Базу я уже создал, внешние ключи тоже указал. А как сделать именно комментирование? Как присваивается id статьи полю page_id?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Вопрос непонятный. Тем более если "внешние ключи тоже указал"
    Код (Text):
    1. insert into comment set page_id=7, comment='You are a genius!';
    Где-нибудь в модели, тут уж я не знаю, как у тебя построено. Может в модели комментариев, может в хранилище комментариев - от твоей архитектуры зависит
     
  5. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    В форме отправки комента
    HTML:
    1. <input type="hidden" name="id_статьи" value="сам_id-шник" />
     
  6. Dilon

    Dilon Активный пользователь

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    А этот
    откуда берется?
     
  7. Dilon

    Dilon Активный пользователь

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Как передать в value="" id статьи?
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ну ты же форму коммента под статьёй будешь выводить, да? Поэтому тебе в этот момент этот id будет известен.
     
    TeslaFeo нравится это.
  9. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Ты статью из БД вытаскиваешь и в этой же строке её id лежит))
     
  10. Dilon

    Dilon Активный пользователь

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Оказывается я с формами вообще не умею работать. Помогите бедолаге пожалуйста.
    Вот такие исходники у меня. Есть список продуктов. К каждому продукту добавлено поле комментирования. То есть такой список заголовков и каждая с полем комментирования. Когда комментирую, в таблице комментариев полю product_id всегда присваивается id первого в выведенном списке продуктов. Как сделать чтобы присваивался id нужного продукта. Не взыщите, задача такая стоит.

    Контроллер
    Код (Text):
    1.  
    2. function commentAction() {
    3.  
    4.     $user_id = isset($_REQUEST['user_id']) ? $_REQUEST['user_id'] : null;
    5.     $user_id = intval($user_id);
    6.  
    7.     $content = isset($_POST['content']) ? $_POST['content'] : null;
    8.     $content = htmlspecialchars($content);
    9.  
    10.     $product_id = $_REQUEST['product_id']; // Видимо здесь нужно что-то придумать
    11.     $product_id = intval($product_id);
    12.  
    13.     // Получение списка всех данных
    14.     $result = addComment($user_id, $content, $product_id);
    15.  
    16. if ($result) {
    17.         $resData['success'] = 1;
    18.         $resData['message'] = 'Комментарий добавлен';
    19.     }else{
    20.         $resData['success'] = 0;
    21.         $resData['message'] = 'Ошибка добавления комментария';
    22.     }
    23.     echo json_encode($resData);
    24.     return;
    25. }
    Модель:
    Код (Text):
    1.  
    2. function addComment($contentComm, $productId, $userId) {
    3.  
    4.     global $pdo;
    5.  
    6.     $statement = $pdo->prepare("INSERT INTO comments (content, product_id, user_id)
    7.               VALUES (:content, :product_id, :user_id)");
    8.     $statement->bindParam(':content', $contentComm);
    9.     $statement->bindParam(':product_id', $productId);
    10.     $statement->bindParam(':user_id', $userId);
    11.     $rs = $statement->execute();
    12.  
    13.     return $rs;
    14. }
    ajax:
    Код (Text):
    1.  
    2. function newComment() {
    3.     var content = $('#newContentComm').val();
    4.     var product_id   = $('#newProductId').val();
    5.     var user_id      = $('#newUserId').val();
    6.  
    7.     var postData = {content: content, product_id: product_id, user_id: user_id};
    8.  
    9.     $.ajax({
    10.         type: 'POST',
    11.         async: false,
    12.         url: "/product/comment/",
    13.         data: postData,
    14.         dataType: 'json',
    15.         success: function(data) {
    16.             alert(data['message']);
    17.             if(data['success']) {
    18.                 $('#newContentComm').val('');
    19.                 $('#newProductId').val('');
    20.                 $('#newUserId').val('');
    21.             }
    22.         }
    23.     });
    24. }
    view:
    Код (Text):
    1.  
    2. {foreach $products as $item name=product}
    3.     <h2><a href="/product/page/{$item['id']}/">{$item['product']}</a></h2>
    4.    
    5.     <form name="comment" action="" method="post">
    6.         <p>
    7.             <label>Комментарий:</label>
    8.             <br />
    9.             <textarea id="newContentComm" name="content" cols="30" rows="3"></textarea>
    10.         </p>
    11.         <p>
    12.             <input id="newProductId" type="hidden" name="product_id" value="{$item['id']}" />
    13.             <input id="newUserId" type="hidden" name="user_id" value="{$authUser['id']}" />
    14.             <input type="submit" onclick="newComment();" value="Отправить" />
    15.         </p>
    16.     </form>
    17.    
    18. {/foreach}
     
  11. Dilon

    Dilon Активный пользователь

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Ну что? Никто не поможет? Хоть советом. В какую сторону мне смотреть, что искать? Комментирование как в Вконтакте например. Множество постов, и каждый пост можно комментировать непосредственно в списке.
     
  12. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Копаться в коде желания нет никакого.
    Алгоритм, вроде, уже описан.
    Что именно не получается?
     
  13. Dilon

    Dilon Активный пользователь

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Да, конечно понимаю. У каждого своих забот полно.

    Короче, когда производится комментирование любого элемента списка, из всего списка срабатывает всегда первая форма добавления комментария. Даже когда заполняешь поле 2-го или 3-го элемента списка, и нажимаешь "Комментировать" в бд в таблицу comments добавляется запись с пустым содержанием комментария. И полю product_id присваивается id первого продукта из списка. Корректно записывается только user_id. Ума не приложу что делать.