[РЕШЕНО]Views 1.6-1.8 сортировка list view

Главные вкладки

Аватар пользователя demonhjack demonhjack 23 августа 2010 в 15:50

Есть drupal 5, модуль views 1.8 и вьюшка с полями "Год" и "Цена". Нужно сделать динамическую сортировку по указанным полям. То есть ссылки, которыми пользователь сможет сортировать содержимое вьюхи как ему вздумается.
Насколько я понимаю, динамическая сортировка модулем поддерживается только для вьюх в табличном виде. Но табличный вид принципиально не устраивает по соображениям форматирования.
Готовых вариантов решения для этих версий софта пока не нашёл, поэтому закралась мысль каким-то образом перехватывать вывод вьюхи своим обработчиком, насильно его сортировать и выдавать пользователю. Не очень понятно только куда можно подоткнуть обработчик для всего этого дела. Может мне кто-нибудь помочь дельным советом?

Комментарии

Аватар пользователя demonhjack demonhjack 25 августа 2010 в 22:46

Хорошая штука - форум: сам спросил - сам ответил.

В общем, я помог себе сам. В действительности всё оказалось несложно, а по сравнению с вариантами, которые находились гуглом - даже изящно.

Итак, у меня была вьюха страничного вида, которая выводила несколько полей с заголовками. Табличное представление меня принципиально не устраивало, тк в нём заголовки полей выносятся в шапку таблицы. А нужно было иметь пару Заголовок: Значение, и при этом дать пользователю две ссылки, которыми он смог бы сортировать вывод вьюхи по одному из двух полей.

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

Вторым шагом я создал ссылки, которыми пользователь будет это делать. Мне они нужны были в заголовке страницы, соответственно, раскрываем пункт "Заголовок" в настройках страничного вида и вписываем туда такой код:

<div class='sortable'>
<b>Упорядочить по:</b><a href="#" onclick="window.location.href='?sort=price'">Цена</a><b>|</b><a href="#" onclick="window.location.href='?sort=year'">Год выпуска</a>
</div>

Не забываем при этом убедиться, что формат ввода под этим полем выставлен в Full HTML.
Код создаёт две ссылки, которые никуда не ведут, но при клике на них срабатывает JavaScript, который прописывает в адресную строку параметр sort с нужным значением и по созданной ссылке переходит.

Дальше мне нужен обработчик этого кода, который и создаётся третьим шагом. Идём в раздел "Аргументы", раскрываем "Аргументы обработки кода" и рисуем туда следующий фрагмент (без тегов <?php и ?>):

<?php
switch ($_GET['sort']) {
  case 
'price':
    unset(
$view->sort['0']);
   
$view->sort[1]['sortorder'] = 'ASC';
    break;
  case 
'year':
    unset(
$view->sort['1']);
    
$view->sort['0']['sortorder'] = 'ASC';
    break;
  default:
    unset(
$view->sort['0']);
    unset(
$view->sort['1']);
    break;
}
?>

Этим кодом я смотрю что вьюхе передано методом GET, ожидая увидеть тот самый параметр sort, который мы прописывали выше. И в зависимости от ситуации что-нибудь делаю с критериями сортировки: если значение sort равно price (у меня это сортировка по цене), то убираю первый критерий сортировки и задаю порядок для второго; если sort равен year (второй критерий), то убираю первый критерий и задаю порядок для второго; если sort равен чему-то другому или его нет совсем, то убираю оба критерия, тк задачи что-либо сортировать без вмешательства пользователя у меня не было.

Итого - 17 строк кода. В принципе, логичнее задавать порядок сортировки в самих критериях и сократить код до 15 строк, да и выглядеть оно будет краше )