Осторожно, здесь лежат драконы.
Вот как я это сделал. Сначала вы создаете представление, отображающее интересующее вас содержание. Добавляйте сортировки по всем интересующим вас полям (количество, цена, заголовок и т. Д.). Не беспокойтесь о том, что все они работают неправильно, вы будете удалять / изменять их в коде.
Я создаю модуль для функции сортировки. Создайте аргумент типа «Global: Null». Он может появиться в любой точке вашего списка, но в этом URL-адресе должен присутствовать аргумент, иначе код не будет выполнен. Я обычно добавляю заголовок или тип поиска. Установите аргумент для отображения всех значений, если они отсутствуют, и добавьте валидатор. Выберите валидатор PHP и добавьте следующее.
return _mymodule_handle_sortables($view);
Это позволит вам быстро / легко редактировать содержимое функции без необходимости редактировать представление / сохранять представление / предварительный просмотр на каждой итерации. Обратите внимание, что я передаю переменную $ _GET. Это не является строго необходимым, так как оно должно быть доступно в функции в любом случае. Я просто делаю это для удобства чтения.
Первый шаг, получить имена сортируемых полей с помощью модуля devel
function _mymodule_handle_sortables(&$view) {
dpm($view->sort);
}
Предварительный просмотр и запишите названия полей. Получив их, вы можете сделать следующее, чтобы изменить вывод представления.
function _mymodule_handle_sortables(&$view) {
switch ($_GET['sort']) {
case 'sell_price_asc':
unset($view->sort['title']);
$view->sort['sell_price']->options['order'] = 'ASC';
break;
case 'sell_price_desc':
unset($view->sort['title']);
$view->sort['sell_price']->options['order'] = 'DESC';
break;
case 'alpha_asc':
unset($view->sort['sell_price']);
$view->sort['title']->options['order'] = 'ASC';
break;
case 'alpha_desc':
unset($view->sort['sell_price']);
$view->sort['title']->options['order'] = 'DESC';
break;
}
return true;
}
Добавьте заголовок PHP к вашему представлению и добавьте к нему следующее
<?php echo _mymodule_sortables($_GET); ?>
Теперь вы можете динамически отображать заголовок сортировки. Вот, по общему признанию, чрезмерная функция для этого.
function _emunications_sortables($g) {
// Collect all the relevant GET parameters
$gopts = array();
foreach ($g as $k=>$v) {
if ($k == 'q') continue;
$gopts[$k] = $v;
}
$opts = http_build_query($gopts);
// Preserve the sort choice for selection
$s1 = $s2 = $s3 = $s4 = '';
switch ($gopts['sort']) {
case 'alpha_asc' : $s1 = 'selected="selected"';break;
case 'alpha_desc' : $s2 = 'selected="selected"';break;
case 'sell_price_asc' : $s3 = 'selected="selected"';break;
case 'sell_price_desc' : $s4 = 'selected="selected"';break;
}
// Unset the sort option so that it can be set in the url manually below
unset($gopts['sort']);
$opts_sort = http_build_query($gopts);
$output = "
<div class='product_index_header'>
<div class='view-selection'>
<span class='descript'>View: </span>
<a class='list' href='/products?$opts'> </a>
<span class='bar'>|</span>
<a class='grid' href='/products/grid/list?$opts'> </a>
</div>
<div class='sortable'>
<select name='droppy' class='droppy kitteh' onchange=\"window.location.href=$('select.droppy').val()\">
<option value='#'>Sort</option>
<option $s1 value='?sort=alpha_asc&$opts_sort'>a-z</option>
<option $s2 value='?sort=alpha_desc&$opts_sort'>z-a</option>
<option $s3 value='?sort=sell_price_asc&$opts_sort'>$ - $$</option>
<option $s4 value='?sort=sell_price_desc&$opts_sort'>$$ - $</option>
</select>
</div>
</div>
";
return $output;
}