Блог
Сортировка товаров по рейтингу
В HostCMS рейтинг товаров строится на основе среднего значения оценки отзывов к товарам. Соответственно, для того, чтобы реализовать сортировку по оценке нужно сначала получить все отзывы к товару, вычислить среднюю оценку и сортировать по ней. Мне удалось справиться с этой проблемой одним SQL запросом, который был составлен методом проб и ошибок.
SELECT shop_items.* FROM shop_items LEFT JOIN comment_shop_items ON comment_shop_items.shop_item_id = shop_items.id LEFT JOIN comments ON comments.id = comment_shop_items.comment_id GROUP BY shop_items.id ORDER BY IFNULL(AVG(grade), 0) DESC
Далее разместим сортировку по рейтингу вместо стандартной сортировки по названию.
1. Перейдем к коду ТДС интернет-магазина.
2. Находим код
$sorting == 4 && $Shop_Controller_Show->shopItems()->queryBuilder() ->clearOrderBy() ->orderBy('shop_items.name', 'ASC'); $sorting == 5 && $Shop_Controller_Show->shopItems()->queryBuilder() ->clearOrderBy() ->orderBy('shop_items.name', 'DESC');
3. Заменяем на
if ($sorting == 4 || $sorting == 5) { $direct = ($sorting == 4)?"DESC":"ASC"; $Shop_Controller_Show->shopItems()->queryBuilder() ->clearOrderBy() ->leftJoin('comment_shop_items', 'comment_shop_items.shop_item_id', '=', 'shop_items.id') ->leftJoin('comments', 'comments.id', '=', 'comment_shop_items.comment_id', array( array('AND' => array('comments.active', '=', 1)), array('AND' => array('comments.deleted', '=', 0)), ) ) ->groupBy('shop_items.id') ->orderBy('IFNULL(AVG(grade), 0)', $direct); }
Теперь вместо сортировки по названию, мы получим сортировку по рейтингу. Осталось только заменить надписи в XSL шаблоне.
-
-
Добрый день. Подскажите, а как добавить еще и сортировку по кол-ву отзывов (оценок).
Сейчас получается так: имеем товар с 100 отзывами и средней оценкой 5 изи 5. И есть товар с 1 отзывом и оценкой 5 из 5. Так вот второй товар встает на первое место, а это не совсем логично. -
-
По логике нужно добавить еще одну сортировку, где сортировать по количеству. То есть к тому коду, который в посте добавить еще ->orderBy('count(comments.id)', $direct); этот способ я не проверял, так что возможно потребует некоторой корректировки.
-