Сортировка списка тикетов по просмотрам и рейтингу

Постоянно прошу... решил поделиться, может кому пригодится (экономия времени, к тому же).
Всем известен вывод pdoPage с выводом списка тикетов. Кроме того, многие знают о том, что в тикетах есть возможность подсчета количества просмотров и система оценок.
К сожалению (я так понимаю, может я и не прав) при превышении некоторого количества тикетов вся система начинает жутко тормозить, и, видимо, поэтому многое не афишируется.
У меня на сайте тикетов около 700 штук, я пока проблем не замечаю.

Решил сделать вывод списка тикетов с упорядочиванием по дате добавления, количеству просмотров и оценок пользователей (по убыванию и возрастанию по каждому из выборов).

Как это сделать проще всего?
Мне показалось, что лучше всего использовать ОДИН pdoPage с join-ами к соответствующим таблицам (TicketVote и TicketView) и выбором сортировки (orderby) и варианта его (sortby) из строки.

[[$headerlist]]
<div id="osnpage">
<div class="rows">
[[!pdoPage?
&element=`getTickets`
&tpl=`TicketArticleRowEdit`
&includeContent=`1`
&includeTVs=`tvrules,tvimageticket`
&ajaxMode=`button`
&pageVarKey=`osn`
&pageNavVar=`osn.nav`
&limit=`25`
&sortby=`[[!sortirovka? &vhod=`[[!#GET.orderby]]`]]`
&leftJoin=`{"Vote":{"class":"TicketVote","on":"Ticket.id=Vote.id and Vote.class='Ticket'"},
"TicketView":{"class": "TicketView","on": "Ticket.id = TicketView.parent"}}`
&select=`{"Ticket":"*", "Vote":"SUM(Vote.value) as rating",
"TicketView": "COUNT(TicketView.uid) as countviews"}`
&groupby=`Ticket.id`
&sortdir=`[[!sortirpor? &vhoda=`[[!#GET.sortby]]`]]`
]]
</div>
[[!+osn.nav]]
</div>

Как сортировать по клику?
Нужно создать чанк headerlist (ниже) с соответствующими ссылками и разместить его вызов перед pdoPage

headerlist 
<a href="[[~[[*id]]]]?orderby=datetime[[!urlfromget?vhodurl=[[!#GET.tag]]]]"
title="Сортировка по дате по убыванию - новые в начале">по дате
<i class="general foundicon-down-arrow"></i></a>
<a href="[[~[[*id]]]]?
orderby=datetime&sortby=asc[[!urlfromget?vhodurl=[[!#GET.tag]]]]"
title="Сортировка по дате по возрастанию - старые в начале">
<i class="general foundicon-up-arrow"></i></a>
<a href="[[~[[*id]]]]?orderby=rating[[!urlfromget?
vhodurl=[[!#GET.tag]]]]"
title="Сортировка по убыванию рейтинга - с большим в начале">по рейтингу
<i class="general foundicon-down-arrow"></i></a>
<a href="[[~[[*id]]]]?orderby=rating&sortby=asc[[!urlfromget?vhodurl=[[!
#GET.tag]]]]"
title="Сортировка по возрастанию рейтинга - с меньшим в начале">
<i class="general foundicon-up-arrow"></i></a>
<a href="[[~[[*id]]]]?orderby=view[[!urlfromget?vhodurl=[[!#GET.tag]]]]"
title="Сортировка по
просмотрам - с большими в начале">по просмотрам
<i class="general foundicon-down-arrow"></i></a>
<a href="[[~[[*id]]]]?orderby=view&sortby=asc[[!urlfromget?vhodurl=[[!#GET.tag]]]]"
title="Сортировка по просмотрам - с меньшими в
начале">
<i class="general foundicon-up-arrow"></i></a>

Кликнув по ссылкам - сразу получаем список статей, начиная с первой страницы.

Сниппеты sortirovka и sortirpor отвечают за возврат нужных полей в зависимости от запроса в командной строке (я это НЕ ДЕЛАЮ прямо из полей, при вызове в pdoPage).
 
sortirovka
<?php
$n = 'createdon';
if(isset($vhod)) $n = $vhod;

switch($n)
{
case 'datetime': return 'createdon';
case 'rating': return 'rating';
case 'view': return 'countviews';
default: return 'createdon';
}
 
sortirpor
<?php
$na = 'DESC';
if(isset($vhoda)) $na = $vhoda;
switch($na)
{
case '':
case 'desc':
return 'desc';
case 'asc': return 'asc';
default: return 'DESC';
}
 
Еще один КРАЙНЕ необходимый сниппет - urlfromget - нужен для правильной передачи в запрос строки с тегом, если это там НУЖНО (сделал, как сделал - мне проще всего показалось так реализовать).

urlfromget добавляет в адрес строку тега, если она (строка тега - tag) ИЗНАЧАЛЬНО там присутствовала.
К примеру, изначальная страница списка статей по тегу The MIR
http://page.maple4.ru/stati-po-tegam.html?tag=THE+MIR&key=tags
после клика по сортировке (по дате добавления ПО ВОЗРАСТАНИЮ, в начале - самые старые) адрес примет вид
http://page.maple4.ru/stati-po-tegam.html?orderby=datetime&sortby=asc&tag=THE+MIR

urlfromget
<?php
$n = '';
if(isset($vhodurl)) $n = $vhodurl;
if($n=='') return '';
$n=urlencode($n);
return '&tag='.$n;

Прошу особо не критиковать за код PHP в сниппетах, но приму ПРАВИЛЬНЫЙ вариант с точки зрения сообщества :)

P.S. 
Есть ли вариант нормальный реализации для работы с избранными страницами?

    
Администратор 15 августа 2018, 11:43 MODx-полезности 0

page.maple4.ru





Рейтинг@Mail.ru