Недавно писал о том, как подружить свои таблицы данных с модулем 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
может быть полноценным членом табличного представления.