Click-sort в табличных Views по виртуальному полю

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

А сегодня столкнулся с тем, что сортировка выборки с помощью views_handler_sort_formula не работает в табличных представлениях. Оказывается, когда мы выводим вьюху в виде таблицы и хотим сортировать таблицу щелчком мыши на заголовок одного из столбцов (что очень удобно) — модуль Views не применяет sort-хэндлер, который был указан при создании поля.

Немного покопавшись в документации, выяснил, что почему-то механизм «click-sort», используемый для сортировки табличных представлений, реализован вообще не в sort-хэндлерах, а вовсе и в field-хэндлерах. Именно поэтому сортировка таблицы по столбцу percentage была невозможна: Views пытался добавить в запрос несуществующее поле вместо формулы. Не вдаваясь в причины именно такой реализации, исправим недочет по горячим следам.

Сортировкой таблицы управляет метод views_handler_field::click_sort($order), где $order — порядок сортировки (ASC/DESC, ага). Поскольку мы уже сделали для своего поля хэндлер mytest_handler_field_percentage, нужно просто добавить к этому классу переопределение метода click_sort():

function click_sort($order) {
  $this->query->add_orderby(NULL, NULL, $order, 'ROUND(testnode.int_count*100/testnode.int_total)');
}

Собственно, вот и все. Теперь поле percentage может быть полноценным членом табличного представления.

Комментарии