Пишем вычисляемое поле для 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
Теги:
views api
Добавлено: 30 Июля 2018 07:21:32 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...