Пишем вычисляемое поле для Views 2
Вычисляемое поле (или виртуальное поле, пользовательское поле, computed field, calculated field) — это поле, которого физически нет в таблице, и значение которого вычисляется на основании других полей или подзапроса.
Добавить такое поле в представление Views можно несколькими способами, но drupal way — это написать свой хэндлер (field handler).
Для примера создадим поле, которое будет выводить количество файлов, прикреплённых к материалу с помощью модуля FileField.
1. В основном файле модуля реализуем хук hook_views_api():
/**
* Implements hook_views_api()
*/
function MODULENAME_views_api() {
return array('api' => 2);
}
2. В папке модуля создаём файл MODULENAME.views.inc и реализуем в нём хук hook_views_data(), в котором описываем новое поле:
/**
* Implements hook_views_data()
*/
function MODULENAME_views_data() {
return array(
'views' => array( // виртуальная таблица модуля Views
'files_count' => array( // системное название виртуального поля
'title' => t('Files count'), // человекопонятное название поля
'help' => t('Number of attached files'), // описание поля
'group' => t('Content'), // группа, в которой будет поле
'field' => array(
'handler' => 'MODULENAME_views_handler_field_files_count', // хэндлер поля
'click sortable' => TRUE, // включаем возможность пользовательской сортировки по этому полю
),
),
),
);
}
3. В этом же файле реализуем хук hook_views_handlers(), в котором указываем базовую информацию о хэндлере:
/**
* Implements hook_views_handlers()
*/
function MODULENAME_views_handlers() {
return array(
'handlers' => array(
'MODULENAME_views_handler_field_files_count' => array(
'parent' => 'views_handler_field_numeric',
'file' => 'MODULENAME_views_handler_field_files_count.inc',
),
),
);
}
4. В папке модуля создаём файл MODULENAME_views_handler_field_files_count.inc и реализуем в нём класс хэндлера, унаследованный от views_handler_field_numeric:
class MODULENAME_views_handler_field_files_count extends views_handler_field_numeric {
function query() {
$this->field_alias = $this->query->add_field(
NULL,
'(SELECT COUNT(*) FROM {content_field_files} cff WHERE cff.nid = node.nid)',
'files_count'
);
}
function click_sort($order) {
$this->query->add_orderby(NULL, NULL, $order, $this->field_alias);
}
}
В методе query() добавляется подзапрос, который возвращает количество файлов для каждого материала.
В методе click_sort() добавляется возможность пользовательской сортировки по виртуальному полю (родительский метод не умеет делать сортировку по синониму).
На этом всё. Сбрасываем кэш, создаём представление, добавляем поля, добавляем новое поле Files count:
Написанное актуально для
Views 6.x-2.x