Повторяющиеся поля комментирования

266
28 апреля 2017, 21:05

Наверно мне сложно выразить свои мысли так как я не профессионал. В базе данных есть продукты. Их нужно вывести на страницу. Я уже вывел, списком, типа ряд постов только в моем случае это только заголовки. Это понятно? Нужно сделать систему комментирования этих постов прямо в этом списке, не заходя на страницу отдельного поста. Мой список выводится циклом foreach и я просто взял и вставил форму добавления комментария в этот foreach. У меня получился этакий список названий с полями добавления комментариев. Написал логику, вроде сам процесс комментирования работает. Но, срабатывает форма добавления комментария только первого заголовка, даже когда я комментирую второй или третий заголовок. Как сделать чтобы срабатывало именно нужное поле.

Помогите пожалуйста! Вот контроллер:

function addcomraitAction() {
    if (! empty($_POST['content'])) {
    $content = isset($_POST['content']) ? $_POST['content'] : null;
    $content = htmlspecialchars($content);
    $user_id = isset($_POST['user_id']) ? $_REQUEST['user_id'] : null;
    $user_id = intval($user_id);
    $product_id = isset($_POST['product_id']) ? $_REQUEST['product_id'] : null;
    $product_id = intval($product_id);
    } else {
        return false;
    }

    $result = insertComment($content, $user_id, $product_id);
if ($result) {
        $resData['success'] = 1;
        $resData['message'] = 'Комментарий добавлен';
    }else{
        $resData['success'] = 0;
        $resData['message'] = 'Ошибка добавления комментария';
    }
    echo json_encode($resData);
    return;
}

А вот так я вывожу на страницу:

{foreach $products as $item name=product}
    <h2><a href="/product/page/{$item['id']}/">{$item['product']}</a></h2>
    <div id="blockNewComment">
    <form name="comment" action="" method="post">
        <p>
            <label>Комментарий:</label>
            <br />
            <textarea id="newContentComm" required name="content" cols="30" rows="3"></textarea>
        </p>
        <p>
            <input id="newProductId" type="hidden" name="product_id" value="{$item['id']}" />
            <input id="newUserId" type="hidden" name="user_id" value="{$authUser['id']}" />
            <input type="submit" onclick="newComment();" value="Отправить" />
        </p>
    </form>
    </div>
{/foreach}

Ajax:

function newComment() {
    var content = $('#newContentComm').val();
    var product_id   = $('#newProductId').val();
    var user_id      = $('#newUserId').val();
    var postData = {content: content, product_id: product_id, user_id: user_id};
    $.ajax({
        type: 'POST',
        async: false,
        url: "/product/addcomrait/",
        data: postData,
        dataType: 'json',
        success: function(data) {
            alert(data['message']);
            if(data['success']) {
                $('#newContentComm').val('');
                $('#newProductId').val('');
                $('#newUserId').val('');
            }
        }
    });
}
Answer 1

Добрый вечер. Ваша проблема в том, что форм для комментариев много (для каждого поста своя, а вот у полей ввода один и тот же id. Когда вы пишете $('#newContentComm').val(); всегда берется значение из первого элемента у которого такой id. По этой причине всегда срабатывает только форма от первого коммента. Исправить это можно несколькими способами. 1. Добавить в id полей ввода id товара, чтобы получалось что-то вроде newContentComm_31415

  1. Получать значения полей ввода исходя из DOM структуры

Остановимся подробнее на первом варианте.

Вывод вашей страницы поменяется так:

{foreach $products as $item name=product
<h2><a href="/product/page/{$item['id']}/">{$item['product']}</a></h2>
<div id="blockNewComment"> 
  <form name="comment" action="" method="post"> 
    <p>
      <label>Комментарий:</label> <br />
      <textarea id="newContentComm{$item['id']}" required name="content" cols="30" rows="3"></textarea>
    </p>
    <p> 
      <input id="newUserId" type="hidden" name="user_id" value="{$authUser['id']}" />
      <input type="submit" onclick="newComment({$item['id']});" value="Отправить" /> 
    </p>
  </form> 
</div>
{/foreach}

Тогда соответственно js код поменяется так:

function newComment(id) { 
  var content = $('#newContentComm'+id).val();
  var user_id = $('#newUserId').val(); 
  var postData = {content: content, product_id: id, user_id: user_id}; 
  $.ajax({ type: 'POST', async: false, 
    url: "/product/addcomrait/", data: postData, dataType: 'json', 
    success: function(data){
     alert(data['message']); 
     if(data['success']) { 
       $('#newContentComm'+id).val(''); } } }); }

Прошу прощение за форматирование кода. Пишу с телефона, не очень удобно тут писать его)

Что изменилось: теперь функция добавления комментария принимает на вход id товара к которому отправляется комментарий. Исходя из id берется значение из нужного textarea. user_id не дублировал, т.к. полагаю во всех формах значение этого поля одинаковое. Ну и поменялся обработчик onclick, чтобы в функцию передавался id товара.

READ ALSO
Подключение единственного js-скрипта в wordpress

Подключение единственного js-скрипта в wordpress

Подскажите, как правильно подключить единственный скрипт в плагине? Те

220
Ограничение ввода в textInput PHP

Ограничение ввода в textInput PHP

Есть поле ввода на php:

259
Парсинг сайта на ASP.net c .aspxauth средствами php

Парсинг сайта на ASP.net c .aspxauth средствами php

Подскажите пожалуйста! Нужно получить с сайта: https://investorshubadvfn

572
Добавить атрибут в ответ ActiveRecord Yii2

Добавить атрибут в ответ ActiveRecord Yii2

Есть таблица состоящая из колонок firstname lastnameкак при запросе Users::find()->all(); получить в ответе еще одну колонку fullname

314