Следуя за сообществом в публикации решений на все случаи жизни, делюсь простым рецептом, на который можно везде давать ссылку :-).
Нужно два сниппета.
sortLink — формирует ссылки, при клике по которым происходит сортировка:
<?php
$url = $_SERVER['REQUEST_URI'];
list($url_part, $qs_part) = array_pad(explode("?", $url), 2, "");
parse_str($qs_part, $qs_vars);
unset($qs_vars['sort']);
unset($qs_vars['dir']);
unset($qs_vars['tv']);
unset($qs_vars['type']);
if (count($qs_vars) > 0) {
$separ = '&';
$url = $url_part."?".http_build_query($qs_vars);
} else {
$separ = '?';
$url = $url_part;
}
if($_GET['sort'] == $field and $_GET['dir'] == 'ASC') $arr='↑';
if($_GET['sort'] == $field and $_GET['dir'] == 'DESC') $arr='↓';
if(isset($tv)) $tv='&tv=1';
if($type=='number') $typ='&type=number';
if(!$_GET[$field]){
if($_GET['dir'] == 'ASC'){
$output = '<a href="'.$url.$separ.'sort='.$field.'&dir=DESC'.$typ.$tv.'">'.$name.''.$arr.'</a>';
} else {
$output = '<a href="'.$url.$separ.'sort='.$field.'&dir=ASC'.$typ.$tv.'">'.$name.''.$arr.'</a>';
}
} else {
$output = '<a href="'.$url.$separ.'sort='.$field.'&dir=ASC'.$typ.$tv.'">'.$name.'</a>';
}
return $output;
У него четыре параметра:
&field — название поля по которому сортировать (TV или стандартное поле ресурса).
&tv — если это TV-параметр установите &tv=`1`.
&type — тип поля (если это число, то установите &type=`number`).
&name — текст самой ссылки, который выводится на сайте.
Используем так:
[[!sortLink? &field=`pagetitle` &name=`По названию`]]
[[!sortLink? &field=`publishedon` &name=`По дате`]]
[[!sortLink? &field=`price` &type=`number` &tv=`1` &name=`По цене`]]
Данная конструкция выведет три ссылки, при клике по которым странице посредством GET-запроса будут передаваться нужные данные.
Второй сниппет Sort, который формирует собственно параметры сортировки:
<?php
$sort = $_GET['sort'];
$type = $_GET['type'];
$tv = $_GET['tv'];
if(isset($sort)) {
if($tv == 1) {
if($integer == 1) $integer = '&sortdirTVType=`integer`';
$output = '
&sortbyTV=`'.$sort.'`
&sortdirTV=`'.$_GET['dir'].'`
'.$integer.'
';
} else {
$output = '
&sortby=`'.$sort.'`
&sortdir=`'.$_GET['dir'].'`
';
}
} else {
if($defsort == '') $defsort = 'menuindex';
if($defdir == '') $defdir = 'ASC';
$output='
&sortby=`'.$defsort.'`
&sortdir=`'.$defdir.'`
';
}
return $output;
У него три параметра:
&integer — если его активировать &integer=`1`, то в выводе появится параметр sortdirTVType, который есть у getProducts и getResources. Именно в этом случае сортировка по числовым значениям будет производиться нормальным образом. Для pdoResources его можно не использовать — достаточно просто тип ввода у TV-поля установить как «Число».
&defsort — сортировка по умолчанию при открытии страницы. Если оставить пустым или не указывать, сортируется по menuindex (позиции в меню/дереве ресурсов).
&defdir — направление сортировки по умолчанию при открытии страницы. Если оставить пустым или не указывать, сортируется от меньшего к большему (ASC).
Вызов сниппета Sort просто вставляем в вызов pdoResources, getResources или getProducts (никаких своих &sortby и &sortdir, естественно, уже не нужно).
pdoResources:
[[!pdoResources?
&parents=`...`
&tpl=`...`
&limit=`...`
[[!Sort? &defsort=`pagetitle`]]
]]
getProducts:
[[!getProducts?
&parents=`...`
&tpl=`...`
&limit=`...`
[[!Sort? &integer=`1` &defsort=`createdon` &defdir=`DESC`]]
]]
getResources:
[[!getResources?
&parents=`...`
&tpl=`...`
&limit=`...`
[[!Sort? &integer=`1`]]
]]
Естественно, с pdoPage это всё также работает:
[[!pdoPage?
&parents=`...`
&tpl=`...`
&limit=`...`
[[!Sort]]
]]
Как и с getPage:
[[!getPage?
&element=`getProducts`
&parents=`...`
&tpl=`...`
&limit=`...`
[[!Sort? &integer=`1`]]
]]
Обратите внимание — все сниппеты вызываются некэшированными.
Зуля 05.12.2015 18:53 #
Как знаете, я новичок в modx. И мне очень интересно изучать новую систему.
Первый php код в этой статье — это для создания своего сниппета? И где его сохранять в шаблонах сайта? Или это как отдельное расширение? Спасибо.
Павел Романов 05.12.2015 19:03 #
И первый и второй — сниппеты. Просто создаете новые, вбиваете название и вставляете в каждый свой код.
Зуля 05.12.2015 19:12 #
ProuD 09.12.2015 11:09 #
<br />
Лучше бы сделать одним сниппетом, а не 3мя и выводить селектом. Если у человека к примеру будет 10 видов сортировок, это 10 сниппетов некэшируемых. 10 лишних запросов вместо 1 в 1 сниппете. Все условно конечно.
Павел Романов 09.12.2015 12:09 #
Как правило, тут не требуется огромного количества параметров. Ну три-четыре максимум, что подходит 90% сайтов. Если нужно что-то бОльшее можно использовать другие решения вплоть до тех же msFilter или tagManager.
Естественно, нет предела совершенству и можно вынести HTML в чанки, сделать шаблонизацию (ответ Дмитрию), объединить все ссылки в один сниппет, но в данном случае это, ИМХО, просто не требуется.
Волков Николай 10.01.2016 09:26 #
Алексей 01.02.2016 09:33 #
Платон Юрьевич Сухаревский 17.02.2017 14:16 #
Пробовал через сам сниппет SimpleSearch не помогло, через pdopage тоже(
[[!pdoPage?
&elementClass=`modSnippet`
&element=`SimpleSearch`
&depth=`0`
&limit=`10`
&pageVarKey=`page`
&includeTVs=`1`
&includeContent=`1`
&tpl=`SimpleSearchResult`
&sortby=`publishedon`
&sortdir=`DESC`
]]
<br />
Павел Романов 17.02.2017 14:30 #
Платон Юрьевич Сухаревский 17.02.2017 14:32 #
через сам SimpleSearch пробовал, тоже самое. Сортировка почему-то не работает
[[!SimpleSearch?
&ids=`19,34,39,42,61,63,64,79`
&tpl=`SimpleSearchResult`
&containerTpl=`SimpleSearchOuter`
&pageTpl=`SimpleSearchPageTpl`
¤tPageTpl=`SimpleSearchPageTplActive`
&includeTVs=`1`
&processTVs=`1`
&sortby=`publishedon`
&sortdir=`DESC`
]]
Павел Романов 17.02.2017 14:40 #
Направление указывать не нужно — там по умолчанию DESC.
Платон Юрьевич Сухаревский 17.02.2017 15:00 #
Павел Романов 17.02.2017 15:17 #
Где-то ошиблись, либо у ресурсов не прописан publishedon.
Добавьте в чанк SimpleSearchResult:
и проверьте.
И здесь же у Вас опечатка?
Платон Юрьевич Сухаревский 17.02.2017 15:49 #
я уже и сам simplesearch переустановил заново, и всё-равно сортировка не работает.
Платон Юрьевич Сухаревский 17.02.2017 15:02 #
Евгений Грибков 05.07.2017 15:59 #
по идеи он должен влиять на ?
liberty 07.09.2018 19:14 #
А если мои tv для сортировки — это часть migx?
Что-то не выходит…
Павел Романов 08.09.2018 18:11 #
liberty 09.09.2018 14:29 #
Павел Романов 09.09.2018 15:34 #