Интеграция модуля с views. Основа


Рассмотрим интеграцию стандартного модуля Dblog, который записывает в бд системные сообщения, с модулем views для вывода информации в удобном виде.
В данном примеры мы просто добавим некоторые поля во view, ничего сверхъестественного.

Шаг 1. Создание основы модуля

Наш новый модуль будет называться DBlog views. Создадим папку для модуля dblog_views с файлами:
dblog_views.info

; $Id$
name = DBlog Views
project = dblog_views
core = "6.x"
version = "6.x-1.0"

dblog_views.module

<?php
// $Id$

/**
 * Implementation of hook_views_api().
 * Говорим системе, что мы работаем с модулем views.
 */

function dblog_views_views_api() {
  return array(
    'api' => 2,
  );
}

Шаг 2. Работа с хуками views

Все общие функции для работы с views должны лежать в файле *.views.inc, создадим его.
dblog_views.views.inc

<?php
// $Id$

/**
 * Implementation of hook_views_data().
 * Используется для описания новой таблицы.
 */

function dblog_views_views_data() {
  // Название группы, будет показываться как префикс к полям, фильтрам, аргументам.
  $data['watchdog']['table']['group']  = t('Watchdog');

  // Определяем таблицу в качестве базовой. Она появится в списке выбора
  // типа view при создании и теперь ей можно пользоваться независимо от других.
  $data['watchdog']['table']['base'] = array(
    'field' => 'wid',
    'title' => t('Watchdog'),
    'help' => t('Table that contains logs of all system events.'),
  );

  // Связываем таблицу watchdog с таблицей users, теперь поля watchdog появятся
  // при использовании типа view User.
  $data['watchdog']['table']['join'] = array(
    'users' => array(
      'left_field' => 'uid',
      'field' => 'uid',
    ),
  );

  // ID события, тут всё стандартно, просто поле и сортировка.
  $data['watchdog']['wid'] = array(
    'title' => t('Wid'),
    'help' => t('Unique watchdog event ID.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_numeric',
    ),
  );

  // Связь с таблицей users для типа Watchdog, позволит в нашем view
  // выбирать поля связанные с пользователями. Новые опции появятся в разделе
  // Relationships. Использован стандартный обработчик.
  $data['watchdog']['uid'] = array(
    'title' => t('User'),
    'help' => t('Relate a watchdog event to the user who triggered the event.'),
    'relationship' => array(
      'handler' => 'views_handler_relationship',
      'base' => 'users', // базовая таблица для связи
      'base field' => 'uid', // поле
      'label' => t('user'),
    ),
  );

  // Поле тип события, всё стандартно кроме фильтра.
  $data['watchdog']['type'] = array(
    'title' => t('Type'),
    'help' => t('Type of log message, for example "user" or "page not found."'), // The help that appears on the UI,
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    // Для фильтра использован свой обработчик.
    'filter' => array(
      'handler' => 'dblog_views_handler_filter_type',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument',
    ),
  );

  // Поле сообщение, также использован свой обработчик, тк. сообщение в базе
  // хранится в виде сериализованного массива, а вывести его надо как обычный текст.
  $data['watchdog']['message'] = array(
    'title' => t('Message'),
    'help' => t('Text of log message.'),
    'field' => array(
      'handler' => 'dblog_views_handler_field_message',
    ),
  );

  // Поле хранящее степень важности события, тк. в базе значения хранятся в
  // виде мало понятных пользователю чилел мы используем собственный
  // обработчики, чтобы пользователю было понятно с ними работать.
  $data['watchdog']['severity'] = array(
    'title' => t('Severity'),
    'help' => t('The severity level of the event; ranges from 0 (Emergency) to 7 (Debug).'),
    'field' => array(
      'handler' => 'dblog_views_handler_field_severity',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort', // сортировка стандартна
    ),
    'filter' => array(
      'handler' => 'dblog_views_handler_filter_severity',
    ),
    'argument' => array(
      'handler' => 'dblog_views_handler_argument_severity',
    ),
  );

  // Время, всё стандартно.
  $data['watchdog']['timestamp'] = array(
    'title' => t('Time'),
    'help' => t('Unix timestamp of when event occurred.'),
    'field' => array(
      'handler' => 'views_handler_field_date',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort_date',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_date',
    ),
  );

  // Время, псевдо поле timestamp2. Используется для продвинутого фильтра на
  // основе собственного обработчика. В реальности оперируем данными
  // из поля timestamp.
  $data['watchdog']['timestamp2'] = array(
    'title' => t('Time 2'),
    'help' => t('Timestamp.'),
    'real field' => 'timestamp', // реально поле
    'filter' => array(
      'handler' => 'dblog_views_handler_filter_timestamp',
    ),
  );

  return $data;
}

/**
 * Implementation of hook_views_handlers().
 * Используется для описания собственный обработчиков, где хранятся файлы, от
 * каких стандартных обработчиков они наследуют свойства.
 */

function dblog_views_views_handlers() {
  return array(
    // сдесь мы говорим views что наши обработчики убдет лежать в подпапке с одноименным названием
    'info' => array(
      'path' => drupal_get_path('module', 'dblog_views') .'/views',
    ),
    'handlers' => array(
      // filters
      'dblog_views_handler_filter_timestamp' => array(
        'parent' => 'views_handler_filter',
      ),
      'dblog_views_handler_filter_severity' => array(
        'parent' => 'views_handler_filter_in_operator',
      ),
      'dblog_views_handler_filter_type' => array(
        'parent' => 'views_handler_filter_in_operator',
      ),
      // fields
      'dblog_views_handler_field_message' => array(
        'parent' => 'views_handler_field',
      ),
      'dblog_views_handler_field_type' => array(
        'parent' => 'views_handler_field',
      ),
      'dblog_views_handler_field_severity' => array(
        'parent' => 'views_handler_field',
      ),
      // arguments
      'dblog_views_handler_argument_severity' => array(
        'parent' => 'dblog_views_handler_argument',
      ),
    ),
  );
}

Обязательно сделайте эту основу модуля она пригодится дальше.

В следующем посте, я расскажу как писать простые обработчики фильтров и аргументов.
А на закуску вас ждут expose filters и формы с иерархией.

Метки: