Не работает сортировка по алфавиту и рейтингу

Подскажите пожалуйста, правильно я понимаю, что здесь нет ссылки на сниппет?

Как создать правильно новый сниппет для сортировки по алфавиту?

<a href="[[~[[*id]]? &sortbyTVType=`integer` &sortbyTV=`rating` &sortdirTV=`DSC`]]"><img src="images/new/rating.png" alt="Сортировка по рейтингу" title="Сортировать по рейтингу"/></a>
<a href="[[~[[*id]]? &sortbyTVType=`integer` &sortbyTV=`pagetitle` &sortdirTV=`ASC`]]"><img src="images/new/ASC.png" alt="Сортировка от А до Я" title="Сортировать от А до Я"/></a>
<a href="[[~[[*id]]? &sortbyTVType=`integer` &sortbyTV=`pagetitle` &sortdirTV=`DSC`]]"><img src="images/new/DSC.png" alt="Сортировка от Я до А" title="Сортировать от Я до А"/></a>
Вячслав
06 октября 2015, 10:43
modx.pro
1 895
0

Комментарии: 2

Максим Кузнецов
06 октября 2015, 17:48
1
0
Понимаете правильно, это какая-то каша.

Допустим, у вас есть сниппет pdoResources на странице вида site.ru/catalog. Ссылки с заранее определенными способами фильтрации будут выглядеть примерно вот так:
site.ru/catalog?sortby=rating&dir=ASC
site.ru/catalog?sortby=pagetitle&dir=DESC
… и так далее.

Все, что идет после site.ru/ — это get-параметр ссылки и его нам необходимо перехватывать, чтобы отдавать сниппету, выводящему ресурсы.

Мы можем создать простой сниппет GET со следующим содержанием:
<?php
	return $_GET[$get];

И вместе с данным сниппетом преобразовывать вывод ресурсов на странице примерно таким образом:

[[!pdoResources? &sortby=`[[!GET:default=`pagetitle`? &get=`sortby`]]` &sortdir=`[[!GET:default=`DESC`? &get=`dir`]]`]]

Минус данного решения в том, что пользователь может вбить свое значение в адрес ссылки, допустим: site.ru/catalog?sortby=TEST&dir=BANAN, в результате чего на странице сниппет вернет ошибку.

Поэтому, напишем свой сниппет pdoResourcesWithSort:

<?php
	//получаем значение требуемых get-параметров
	$sortby = $_GET[$sortbyGet];
	$sortdir = $_GET[$sortdirGet];
	
	//сверяем их со списком разрешенных полей для сортировки (дополнить по вкусу)
	$allowSortBy = array('pagetitle', 'publishedon', 'createdon');
	if (!in_array($sortby, $allowSortBy)) {
		//если совпадений нет - выставляем значение сортировки по умолчанию
		$sortby = 'pagetitle';
	}
	
	$allowSortDir = array('ASC', 'DESC');
	if (!in_array($sortdir, $allowSortDir)) {
		$sortdir = 'ASC';
	}

	//теперь вызываем pdoResources с отфильтрованными параметрами сортировки
	//дописать требуемые параметры вызова сниппета при необходимости
	$pdoParams = array();
	$pdoParams['sortby'] = $sortby;
	$pdoParams['sortdir'] = $sortdir;
	
	//возвращаем результат выполнения сниппета
	return $modx->runSnippet('pdoResources', $pdoParams);

Вызывается как-то так: [[!pdoResourcesWithSort? &sortbyGet=`sortby` &sortdirGet=`dir`]]
    rumano
    09 мая 2017, 08:50
    0
    А можно и так:

    [[!pdoPage?
    &class=`geodata`
    &loadModels=`geodata`

    &sortby=`[[!#GET.sortby:is=`city_name`:or:is=`country_name`:then=`[[!#GET.sortby]]`:else=`city_name`]]`
    &sortdir=`[[!#GET.sortdir:is=`asc`:or:is=`desc`:then=`[[!#GET.sortdir]]`:else=`asc`]]`
    ]]
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2