0. Похоже, это не тот случай, где можно быстро передать конечный результат другому, дабы он не трахался столько времени
То, что я написал для себя вообще ужасно выглядит со стороны + заточено под конкретику, посему попробую передать суть на абстрактном примере. Возможно, у кого-то дойдут руки сделать что-то универсальное по похожему принципу.
Кривой способ сделать сортировку по нужным параметрам. Как сделать лучше - пока не ведаю.
1. Для примера возьму 4ре переменных:
$p = цена. Значения: любые, заданные в соотв. ТВ
$t = товар. Значения: любые, заданные в соотв. ТВ
$b = "сортировать ПО". Значения: pagetitle, id и прочий стандарт, а также ТВ
$s = прямая или обратная сортировка. Значения: 1,2.
Создаем сниппет, например "SortLink":
<?php
# Забираем нужные переменные из строки адреса
$p=$_GET[’p’];
$t=$_GET[’t’];
$s=$_GET[’s’];
$b=$_GET[’b’];
# Задаем плэйсхолдеры для сравнения и сохранения или смены сортировки "прямая/обратная"
$modx->setPlaceholder(’plb’,$b);
$modx->setPlaceholder(’pls’,$s);
# Возвращаем все значения переменных в ссылку, кроме переменных "b" и "s".
return ’<a href=[~[*id*]~]?p=’.$p.’&t=’.$t.’&b=’;
?>
2. Ссылка для сортировки по имени:
[[SortLink]]pagetitle[+phx:if=`[+plb+]`:is=`pagetitle`:and:if=`[+pls+]`:is=`2`:then=`&s=1>ИМЯ</a> ↑`+][+phx:if=`[+plb+]`:is=`pagetitle`:and:if=`[+pls+]`:is=`1`:then=`&s=2>ИМЯ</a> ↓`:or:if=`[+plb+]`:is=`pagetitle`:and:if=`[+pls+]`:is=``:then=`&s=2>ИМЯ</a> ↓`+][+phx:if=`[+plb+]`:isnot=`pagetitle`:then=`&s=[+pls+]>ИМЯ</a>`+]
Ссылка для сортировки по товару:
[[SortLink]]tovar[+phx:if=`[+plb+]`:is=`tovar`:and:if=`[+pls+]`:is=`2`:then=`&s=1>ТОВАР</a> ↑`+][+phx:if=`[+plb+]`:is=`tovar`:and:if=`[+pls+]`:is=`1`:then=`&s=2>ТОВАР</a> ↓`:or:if=`[+plb+]`:is=`tovar`:and:if=`[+pls+]`:is=``:then=`&s=2>ТОВАР</a> ↓`+][+phx:if=`[+plb+]`:isnot=`tovar`:then=`&s=[+pls+]>ТОВАР</a>`+]
Ссылка для сортировки по цене:
[[SortLink]]price[+phx:if=`[+plb+]`:is=`price`:and:if=`[+pls+]`:is=`2`:then=`&s=1>ЦЕНА</a> ↑`+][+phx:if=`[+plb+]`:is=`price`:and:if=`[+pls+]`:is=`1`:then=`&s=2>ЦЕНА</a> ↓`:or:if=`[+plb+]`:is=`price`:and:if=`[+pls+]`:is=``:then=`&s=2>ЦЕНА</a> ↓`+][+phx:if=`[+plb+]`:isnot=`price`:then=`&s=[+pls+]>ЦЕНА</a>`+]
* Проверяет порядок сортировки; если ссылка другая - сохраняет, если та же - меняет.
3. Предполагается что в сниппете вывода результатов поиска есть все для перехвата и обработки этих переменных. Как пример:
# если 2, то сортировка обратная, иначе прямая
if ($s == ’2’) { $s = ’DESC’; } else { $s = ’ASC’; }
# если "сортировать по" не задано - сортировать по заголовку страницы
if ($b == ’’) { $b = ’pagetitle’; }
# Задаем значения для поиска дитто
# Можно описать хоть 50 категорий товара
if ($t == ’elka’) { $elka = ’tovar,elka,1|’; }
if ($t == ’pihta’) { $pihta = ’tovar,pihta,1|’; }
if ($t == ’sosna’) { $sosna = ’tovar,sosna,1|’; }
# Задаем точное значение цены для поиска дитто, например "5000-10000"
$pr = ’price,$p,1|’;
# Склеиваем значения для поиска дитто (если нам нужен был поиск сразу по всем параметрам, например, магазина со всеми этими товарами)
$filter = $pr.$elka.$pihta.$sosna;
# Если поиск нужен только по одному из значений можно сделать проще:
# $to = ’tovar,$t,1|’;
# $filter = $pr.$to;
# Задаем параметры для Дитто
$params[’id’] = ’lcid’;
$params[’startID’] = ’0’;
$params[’sortBy’] = $b;
$params[’sortDir’] = $s;
$params[’hideFolders’] = ’1’;
$params[’tpl’] = ’ditto_link’;
$params[’language’] = ’russian’;
$params[’dateFormat’] = ’%Y.%m.%d’;
$params[’summarize’] = ’25’;
$params[’paginate’] = ’1’;
$params[’filter’] = $filter;
$params[’debug’] = ’0’;
# Передаем параметры Дитто
$di = $modx->runSnippet(’Ditto’, $params);
$style = ’Тут начало оформления.’;
if ($b == ’pagetitle’) { $sortpo = ’
* Сортировка по названию.’; }
if ($b == ’price’) { $sortpo = ’
* Сортировка по цене.’; }
if ($b == ’tovar’) { $sortpo = ’
* Сортировка по товару.’; }
$textdo = $style.$sortpo;
$textpo = ’Тут конец оформления.’;
# Склеиаем текст-до + вызов Дитто + текст-после
$resc = $textdo.$di.$textpo;
# Выводим результат
return $resc;
P.S. Пример писал на форуме и на скорую руку, не тестил. Будут баги/вопросы - пишите, будет время - отвечу. Так же возможны орфографические и пунктуационные ошибки
Не придирайтесь.