Программное изменение критериев сортировки во Views в Drupal

11 августа 2014 - 18:00

Постановка задачи

На Drupal-сайте имеется view, выводящее ноды, отсортированные по дате публикации. Во вьюшке настроен раскрытый фильтр по одному из полей. Необходимо в случае, если введено значение раскрытого фильтра, выводить ноды, отсортированные уже по этому фильтру.

Решение

Рассмотрим решение задачи на примере вьюшки-каталога с раскрытым фильтром по полю цены товара с машинным именем field_price (например, «Цена, до» или «Цена, от»). Нам понадобится изменить запрос во view с помощью хука hook_views_query_alter(). Имплементировав хук в своем модуле, изменяем критерий сортировки следующим образом:

<?php
/**
* Implements hook_views_query_alter().
*/

function my_views_views_query_alter(&$view, &$query) {
  if ($view->name == 'catalog') {
    if ($view->exposed_data['field_price_value']) {
      $query->orderby[0]['field'] = 'field_price_value';
      $query->orderby[0]['direction'] = 'DESC';
    }
  }
}

В данном примере сортировка осуществляется по убыванию цены, если бы необходимо было выводить товары по возрастанию цены, в параметре direction критерия сортировки мы бы указали ASC. Очевидно, что задачу можно решить и в случае использования нескольких раскрытых фильтров в представлении.