Перейти к содержимому


Фото
- - - - -

Отзывы на товары

отзывы комментарии

  • Чтобы отвечать, сперва войдите на форум
20 ответов в теме

#1 Yurinur

Yurinur
  • Пользователь
  • 5 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 19.12.2018 - 16:12

Всем доброго времени суток!

 

На сайте есть отдельная страница с отзывами к товарам, на эту страницу валятся все отзывы с различных товарных карточек. Выглядит это так:

Прикрепленный файл  otzyvi.JPG   74,77К   40 раз скачано

 

Задача состоит в том, чтобы немного модернизировать вывод информации, т.е. к отзыву добавить фото товара, наименование товара, вот как здесь:

Прикрепленный файл  otzyvi2.JPG   31,22К   47 раз скачано

 

Модуль отвечающий за комментарии connents.tpl выглядит вот так:

 

{* Список записей блога *}
{* Канонический адрес страницы *}
{$canonical="/otzyvy" scope=parent}
<!-- Заголовок /-->
<h1>{$page->name}</h1>
<p>&nbsp;</p>
{include file='pagination.tpl'}
 
<!-- Отзывы /-->
<div id="item">
<div class="block reviews">
<div id="reviewlist">
    {foreach $comments as $comment}
  <div id="bx_{$comment->id}" class="hreview">
    <p class="review-meta">
    <span class="dtreviewed">{$comment->date|date}, {$comment->date|time}<span title="{$comment->date|date}" class="value-title"></span></span>
    <span class="sep">|</span> <span class="reviewer">{$comment->name|escape}</span> написал(а): {if !$comment->approved}<span class="sep">- ожидает модерации</span>{/if}</p>
    <p class="description">{$comment->text|escape|nl2br}</p>
    <p><a href="{$comment->purl}">Отзыв на странице товара</a></p>
    
  </div>
    {/foreach}
</div>
</div>
</div>
<!-- Отзывы #End /-->
 
{include file='pagination.tpl'}
 
Я так понимаю, что в него нужно добавить определенные строки по выводу необходимых полей, но я не программист, поэтому и обращаюсь к вам за помощью.


#2 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 13.01.2019 - 14:48

Интересная вещь. Сделаю-ка я пожалуй и себе отдельную страницу с отзывами.

Страницу добавлю в закладки, завтра посмотрю, как вывести к нужному товару его картинку, и хватит ли моих знаний. А пока я занят, попробуйте куда-нибудь вставить такой код

 

 

{foreach $last_comments as $comment}
{$comment->name|escape}

{$comment->url}

{$comment->product}

{$comment->product->image}
{/foreach}
 

 

Должен вывести url адрес товара, его имя и изображение (изображение вряд ли, но попробуйте).


#3 Yurinur

Yurinur
  • Пользователь
  • 5 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 13.01.2019 - 15:07

Код вставляю, ничего не меняется.



#4 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 14.01.2019 - 11:04

Для вывода изображения вам надо будет редактировать api/Comments.php, конкретно это обращение к базе
            if($filter['type'] == 'product')
            {
                $products_fields = ', p.url, p.name product';
                $products_join = 'INNER JOIN __products p ON c.object_id=p.id';
            }
 

 

В таблице s_products нет изображений, нужно запросить из s_images, где тот же id
Без этого вам доступен {$comment->url} вместо вашего {$comment->purl}, непонятно откуда взявшегося.


#5 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 7 107 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 14.01.2019 - 11:17


Для вывода изображения вам надо будет редактировать api/Comments.php, конкретно это обращение к базе

            if($filter['type'] == 'product')
		    {
                $products_fields = ', p.url, p.name product';
			    $products_join = 'INNER JOIN __products p ON c.object_id=p.id';
		    }

В таблице s_products нет изображений, нужно запросить из s_images, где тот же id
Без этого вам доступен {$comment->url} вместо вашего {$comment->purl}, непонятно откуда взявшегося.
Так делать не стоит.
Нужно в контроллере привязать сущность изображений к сущности комментариев, смотрите как это это сделано сущностью товаров.
Удачи!

#6 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 11:41

удалено


Изменено: question, 24.01.2019 - 12:01


#7 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 12:01

Очень странно. Вот рабочий SQL запрос, который выводит комментарии с картинками.

 

SELECT c.id, c.object_id, c.ip, c.name, c.text, c.type, c.date, c.text, c.approved, i.filename as image 
FROM s_comments c, s_images i WHERE i.product_id = c.id ORDER BY i.position ASC
 

 

Но перенеся это в код

 

        $query = $this->db->placehold("SELECT c.id, c.object_id, c.ip, c.name, c.text, c.type, c.date, c.text, c.approved, i.filename as image
        $products_fields FROM __comments c, __images i $products_join WHERE i.product_id = c.id $object_id_filter $type_filter $keyword_filter $approved_filter ORDER BY id $sort $sql_limit");

 

Ничего не выводит.


#8 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 12:31

Всё дело в том, что теперь скрипт формирует следующий запрос

 

SELECT c.id, c.object_id, c.ip, c.name, c.text, c.type, c.date, c.text, c.approved, i.filename as image , p.url, p.name product FROM s_comments c, s_images i INNER JOIN s_products p ON c.object_id=p.id WHERE i.product_id = c.id AND c.type='product' AND (c.approved=1 ) ORDER BY id DESC
 

Какая тут допущена ошибка, мне непонятно. Исправив ошибку, можно получить image товара, к которому оставлен комментарий.

Помогите найти ошибку


Изменено: question, 24.01.2019 - 13:16


#9 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 13:28

Проблема здесь именно в части

 

INNER JOIN s_products p ON c.object_id=p.id
 

 

MySQL не понимает, что такое c.object_id:

Неизвестный столбец 'c.id' в 'on clause'



#10 phukortsin

phukortsin
  • Фрилансер
  • 824 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 24.01.2019 - 13:40

Пробуйте

 


SELECT c.id, c.object_id, c.ip, c.name, c.text, c.type, c.date, c.text, c.approved, i.filename as image , p.url, p.name product FROM s_comments c INNER JOIN s_products p ON c.object_id=p.id, s_images i WHERE i.product_id = c.id AND c.type='product' AND (c.approved=1 ) ORDER BY id DESC 


#11 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 14:18

Без INNER JOIN этот запрос выглядел бы вот так

 

 

SELECT c.id, c.object_id, c.ip, c.name, c.text, c.type, c.date, c.text, c.approved, p.url, p.name product, p.id, i.filename
FROM s_comments c, s_images i, s_products p




where p.id = c.object_id AND i.product_id = c.object_id AND c.type='product' AND (c.approved=1 ) 


ORDER BY c.id DESC
 

Он работает.



#12 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 14:21

Пробуйте

 


SELECT c.id, c.object_id, c.ip, c.name, c.text, c.type, c.date, c.text, c.approved, i.filename as image , p.url, p.name product FROM s_comments c INNER JOIN s_products p ON c.object_id=p.id, s_images i WHERE i.product_id = c.id AND c.type='product' AND (c.approved=1 ) ORDER BY id DESC 

Ура, работает! Спасибо.



#13 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 14:51

Всё бы хорошо, но в MySQL выводится нужное количество строк, а при выводе всех комментариев выводится комментарий для каждого изображения товара. Например, будет три изображения у товара, выведется 3 одинаковых комментария с тремя разными картинками.

Временно исправил (вроде бы исправил) ситуацию, указав в sql

 

WHERE i.product_id = c.object_id AND i.position=0
 

Но это лишь временно, т.к. position может начинаться с 1.



#14 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 16:41

SELECT DISTINCT не помогвет

MIN (i.position) показывает только один комментарий.

WHERE i.product_id = c.object_id AND i.position=0 - костыль.

GROUP BY i.position HAVING COUNT(*)=1 выдаёт всего один комментарий несколько раз (столько, сколько в нём встречается изображений)


Изменено: question, 24.01.2019 - 16:51


#15 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 17:14

Дошло. Комментарий должен быть уникальным. Значит в конце так

 

 

GROUP BY c.id ORDER BY id $sort $sql_limit
 

 

Гуру, правильно? Работает, вроде бы.



#16 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 17:22

Итого comments.php у меня такой

 

require_once('simpla.php');
class Comments extends simpla
{
    public function get_comment($id)
    {
        $query = $this->db->placehold("SELECT c.id, c.object_id, c.name, c.ip, c.type, c.text, c.date, c.approved
        FROM __comments c WHERE id=? LIMIT 1", intval($id));


        if($this->db->query($query))
            return $this->db->result();
        else
            return false; 
    }


    public function get_comments($filter = array())
    {    
        $limit = 0;
        $page = 1;
        $object_id_filter = '';
        $type_filter = '';
        $keyword_filter = '';
        $approved_filter = '';
        $products_fields = '';
        $products_join = '';
        if(!empty($filter['type']))
            if($filter['type'] == 'product')
            {
                $products_fields = ', p.url, p.name product';
                $products_join = 'INNER JOIN __products p ON c.object_id = p.id, n_images i';
            }
            elseif($filter['type'] == 'blog')
            {
                $products_fields = ', b.url, b.name product';
                $products_join = 'INNER JOIN __blog b ON c.object_id=b.id';
            }
            
        if(isset($filter['limit']))
            $limit = max(1, intval($filter['limit']));


        if(isset($filter['page']))
            $page = max(1, intval($filter['page']));


        if(isset($filter['ip']))
            $ip = $this->db->placehold("OR c.ip=?", $filter['ip']);
        if(isset($filter['approved']))
            $approved_filter = $this->db->placehold("AND (c.approved=? $ip)", intval($filter['approved']));
            
        if($limit)
            $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);
        else
            $sql_limit = '';


        if(!empty($filter['object_id']))
            $object_id_filter = $this->db->placehold('AND c.object_id in(?@)', (array)$filter['object_id']);


        if(!empty($filter['type']))
            $type_filter = $this->db->placehold('AND c.type=?', $filter['type']);


        if(!empty($filter['keyword']))
        {
            $keywords = explode(' ', $filter['keyword']);
            foreach($keywords as $keyword)
                $keyword_filter .= $this->db->placehold('AND c.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.text LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" ');
        }


        $sort='DESC';
        
        $query = $this->db->placehold("SELECT c.id, c.object_id, c.ip, c.name, c.text, c.type, c.date, c.approved, i.filename as image


        $products_fields FROM __comments c $products_join WHERE i.product_id = c.object_id $object_id_filter $type_filter $keyword_filter $approved_filter GROUP BY c.id ORDER BY id $sort $sql_limit");
        
        $this->db->query($query);


        return $this->db->results();
    }
    
    public function count_comments($filter = array())
    {    
        $object_id_filter = '';
        $type_filter = '';
        $approved_filter = '';
        $keyword_filter = '';


        if(!empty($filter['object_id']))
            $object_id_filter = $this->db->placehold('AND c.object_id in(?@)', (array)$filter['object_id']);


        if(!empty($filter['type']))
            $type_filter = $this->db->placehold('AND c.type=?', $filter['type']);


        if(isset($filter['approved']))
            $approved_filter = $this->db->placehold('AND c.approved=?', intval($filter['approved']));


        if(!empty($filter['keyword']))
        {
            $keywords = explode(' ', $filter['keyword']);
            foreach($keywords as $keyword)
                $keyword_filter .= $this->db->placehold('AND c.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.text LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" ');
        }


        $query = $this->db->placehold("SELECT count(distinct c.id) as count
                                        FROM __comments c WHERE 1 $object_id_filter $type_filter $keyword_filter $approved_filter", $this->settings->date_format);
    
        $this->db->query($query);    
        return $this->db->result('count');


    }
    
    public function add_comment($comment)
    {    
        $query = $this->db->placehold('INSERT INTO __comments
        SET ?%,
        date = NOW()',
        $comment);


        if(!$this->db->query($query))
            return false;


        $id = $this->db->insert_id();
        return $id;
    }
    
    public function update_comment($id, $comment)
    {
        $date_query = '';
        if(isset($comment->date))
        {
            $date = $comment->date;
            unset($comment->date);
            $date_query = $this->db->placehold(', date=STR_TO_DATE(?, ?)', $date, $this->settings->date_format);
        }
        $query = $this->db->placehold("UPDATE __comments SET ?% $date_query WHERE id in(?@) LIMIT 1", $comment, (array)$id);
        $this->db->query($query);
        return $id;
    }


    public function delete_comment($id)
    {
        if(!empty($id))
        {
            $query = $this->db->placehold("DELETE FROM __comments WHERE id=? LIMIT 1", intval($id));
            $this->db->query($query);
        }
    }    
}

 

Теперь вывод комментария:

 

 

{get_comments var=last_comments type='product'}
{foreach $last_comments as $comment}
{$comment->image}
{$comment->name}
{$comment->url}
{$comment->product}
{$comment->date|date}
{$comment->text}
{/foreach}

 

Проверяйте.



#17 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 24.01.2019 - 18:41

Демо http://tetramebel.ru/отзывы

Остальной функционал сайта работает через пень-колоду, но задача ТС, как мне кажется, решена.



#18 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 03.02.2019 - 10:27

В моём коде допущена ошибка, в админке отзывы не отображались. Только вчера заметил.



#19 WIXVW

WIXVW
  • Пользователь
  • 19 сообщений
  • Дизайн, Верстка, SEO, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Одесса

Опубликовано 08.02.2019 - 16:40

Привет, а можно полный код вывода отзывов для товаров на отдельную страницу уже с фото и названием?
Лазил по форуму, находил пару веток с выводом отзывов на отдельной странице, но по ним ничего не вышло(



#20 question

question
  • Пользователь
  • 273 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 09.02.2019 - 14:00

Не могу полную инструкцию сделать, мне на это очень много времени понадобится, тем более, когда скрипт уже отличается от оригинального.

Все правки в теме выкладывал.







Также с меткой «отзывы комментарии»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых