Вывод отзывов на любой странице с пагинацией

В продолжении темы Вывод товаров на любой странице с пагинацией

В этот раз предлагаю решение вывода отзывов с пагинацией. Думаю много кому пригодится.
Решение не идеальное, не тестировал на lazy load, было бы неплохо если кто-нибудь дал обратную связь

В отличии от метода вывода товаров, этот более замороченный, так как необходимо добавить пользовательский класс. Учитывая это, стоит понимать что данный метод невозможно воспроизвести в облаке webasyst.

Создаём файл wa-apps/shop/lib/classes/shopCustom.class.php

Такого содержания:

<?php
class shopCustom
{
    public function reviews($limit = 10, $offset = 0)
    {
        $product_reviews_model = new shopProductReviewsModel();
        return $product_reviews_model->getList('*,is_new,contact,product', array(
            'where'  => array(
                'review_id' => 0,
                'status'    => shopProductReviewsModel::STATUS_PUBLISHED
            ),
            'limit'  => $limit,
            'offset'  => $offset,
            'escape' => true
        ));
    }
}

Далее, очищаем кеш в инсталлере. И ставим сам код вывода отзывов:

{if $wa->shop}
{$rev_on_page = 15}
{$page_count = ceil(count($wa->shop->reviews(500))/$rev_on_page)}
{$curr_page = $smarty.get.page-1}
{if $curr_page < 0}{$curr_page = 0}{/if}
{$reviews = shopCustom::reviews($rev_on_page, $rev_on_page*$curr_page)}

{foreach $reviews as $review}
    {include file=$wa->shop->themePath("ID ВАШЕЙ ТЕМЫ")|cat:"review.html" inline reply_allowed=false single_view=true review=$review}
{/foreach}

<div class="pagination">
{wa_pagination total=$page_count attrs=['class' => "menu-h"]}
</div>
{/if} 

Указываем ID темы в коде, можно менять количество выводимых отзывов на странице, в строке {$rev_on_page = 15}

Если у вас более 500 отзывов, то укажите порог выше, в третьей строке

1 ответ

  • 2
    Алексей Webasyst 2 октября 2017 11:55 #

    Хелпер здесь очень сомнителен и делает доп.запрос, если вы то же самое можете сделать без него через array_slice уже на основе имеющихся данных. Нечто вида:

    {$reviews = $wa->shop->reviews(500)}
    {$page_count = ceil(count($reviews)/$rev_on_page)}
    ...
    {$reviews = $reviews|array_slice:$rev_on_page*$curr_page:$rev_on_page}
    {foreach $reviews}
    • +1
      Ольга Ольга 23 марта 2018 13:27 #

      Подскажите, как вывести комментарии к отзывам? $review.comments не выводит((

      • +1
        Владимир Владимир 29 января 2019 22:02 #

        здесь можна использовать вместо метода $product_reviews_model->getList(...) метод getFullTree, например, в хелпере используем $product_reviews_model->getFullTree(...)

        public function reviewsFull($product_id, $offset = 0, $limit = 5, $order = null)
            {
                $product_reviews_model = new shopProductReviewsModel();
                return $product_reviews_model->getFullTree(
                    $product_id, $offset, $limit,
                    $order,
                    array('is_new' => true)
                );
                
            }

        а на страничке отзывов reviews.html

        {if $wa->shop}
           {$rev_on_page = 5}
           {$page_count = ceil(count($wa->shop->reviews())/$rev_on_page)}
           {$curr_page = $smarty.get.page-1}
           {if $curr_page < 0}{$curr_page = 0}{/if}
           {*$reviews = shopCustom::reviews($rev_on_page, $rev_on_page*$curr_page)*}
           {$reviews = shopCustom::reviewsFull($product.id, $rev_on_page*$curr_page, $rev_on_page, 'datetime DESC')}
                        
                        {foreach $reviews as $review}
                            <li data-id={$review.id} data-parent-id="0">
                                {include file="review.html" inline reply_allowed=$reply_allowed review=$review inline }
                                {if !empty($review.comments)}
                                    {review_reviews reviews=$review.comments}
                                {else}
                                    <ul class="reviews-branch"></ul>
                                {/if}
                            </li>
                        {/foreach}
                        
                        <div class="pagination">
                        {wa_pagination total=$page_count attrs=['class' => "menu-h"]}
                        </div>
                    {/if} 

        но....если шаблон не предусматривает lazyload, то нада в скрипте добавления отзыва убирать конструкцию ?page=??

        я сделал через костыль

        function addReview() {
                var href = location.href.replace(/[?]page=[0-9]*/g, '');
                href = href.replace(/\/#\/[^#]*|\/#|\/$/g, '') + '/add/';
                $.post(
                    href,
                    form.serialize(),
                    бла-бла-бла  

        • +1
          Ольга Ольга 1 февраля 2019 11:38 #

          по вашему способу получаю ошибку типа: Syntax Error in template..... unknown tag review_reviews...

    • +1
      Плебей Плебей 12 сентября 2018 20:42 #

      Алексей, попробовал ваше решение.

      Вылетает с ошибкой. Вот эта строка ему не нравится:

      {$reviews = $reviews|array_slice:$rev_on_page*$curr_page:$rev_on_page}

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите