Views API. Описание своих таблиц.

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

Полная статья »

Источник: http://www.drupal.ru/node/86430

Views API часть 1 (подключаем свою таблицу )

Бывают случаи когда нужно подключить таблицу из своего модуля ко views, а документации по этому поводу на русском языке нет.
Так как сам достаточно долго с этим промучился напишу ликбез, основываясь на документации http://views.doc.logrus.com/main.html и своем опыте, поехали!

1) нужно создать в корне модуля файл имямодуля.views.inc
*Если этот файл лежит не в корне модуля, то необходимо поместить hook_views_api() в файл .module
и указать в параметре ‘path’ путь к файлу, если файл лежит в корне папки модуля параметр ‘path’ можно опустить.

<?phpfunction hook_views_api() {
   return array(
     'api' => 2,
     'path' => drupal_get_path('module', 'example') . '/includes/views', 
   );
 }?>

2) Описываем таблицу в новом файле, применяя hook_views_data()

Допустим у нас таблица содержит разные данные и имеет следующее строение:
/ CREATE TABLE example_table (
// nid INT(11) NOT NULL COMMENT ‘Primary key; refers to {node}.nid.’,
// plain_text_field VARCHAR(32) COMMENT ‘Just a plain text field.’,
// numeric_field INT(11) COMMENT ‘Just a numeric field.’,
// boolean_field INT(1) COMMENT ‘Just an on/off field.’,
// timestamp_field INT(8) COMMENT ‘Just a timestamp field.’,
// PRIMARY KEY(nid)
// );

тогда хук будет выглядеть так:

<?php
//Определям группу для таблицы 
// ['example_table'] - имя нашей таблицы, 
// ['table'] - означает что мы задаем настройки для подключения таблицы
// ['group'] - означает задаем название группы
 $data['example_table']['table']['group'] = t('Example table');

 
 //этот параметр не обязателен
 // если необходимо определяем таблицу как базовую,
// если этот параметр присутствует то на странице admin/build/views/add в View type: появиться еще один чекбокс с вашей таблицей
// указанная таблица будет являтся базовой, а это означает, при поставлении запросов другие таблицы будут JOIN -ится к ней
// в большенстве случаев ваша таблица должна быть связана с таблицами 'users' или 'node' или др, тогда этот параметр лучше не указывать 
   $data['example_table']['table']['base'] = array(
     'field' => 'nid',
     'title' => t('Example table'),
     'help' => t("Example table contains example content and can be related to nodes."),
     'weight' => -10,
   );
 

//указываем к какой таблице JOIN иться нашей
   $data['example_table']['table']['join'] = array(
// 'node' - означает имя таблицы, которая является базовой, елси вместо 'node' указать допустим 'users',
// то чтобы увидеть настроки для этого поля на странице admin/build/views/add в View type: необходимо поставить чекбокс
// напротив "Пользователь"
// 'left_field' и 'field' -  поля по которым будет производиться JOIN 
// 'left_field' - первичный ключ базовой таблицы, в данном случае node
// 'field' - поле нашей таблицы
     'node' => array(
       'left_field' => 'nid',
       'field' => 'nid',
     ),
   );
 
 // Дальше производим подключение остальных полей нашей таблицы
 // параметы будут иметь вид:
// ['example_table'] - имя нашей таблицы, 
// ['****'] - имя столбца нашей таблицы
// здесь добавлям для каждого поля свои подпараметры, которые соотвествуют настрокам во views:
// 'relationship', 'arguments', 'field', 'sort', 'filter', у которых указываются свои подпараметры
 
   // Node ID field.
   $data['example_table']['nid'] = array(
     'title' => t('Example content'),
     'help' => t('Some example content that references a node.'),
// Так, как поле nid в нашей таблице является внишним ключем для таблицы {node} мы можем настроть relationship
// для этого поля.
     'relationship' => array(
       'base' => 'node',
       'field' => 'nid',
       'handler' => 'views_handler_relationship',
       'label' => t('Example node'),
     ),
   );
 
 
// дальше идут примеры полей различного типа
   // текстовое поле.
   $data['example_table']['plain_text_field'] = array(
     'title' => t('Plain text field'),
     'help' => t('Just a plain text field.'),
     'field' => array(
       'handler' => 'views_handler_field',
       'click sortable' => TRUE,
     ),
     'sort' => array(
       'handler' => 'views_handler_sort',
     ),
     'filter' => array(
      'handler' => 'views_handler_filter_string',
     ),
     'argument' => array(
      'handler' => 'views_handler_argument_string',
     ),
   );
 
   // цифровое поле.
   $data['example_table']['numeric_field'] = array(
     'title' => t('Numeric field'),
     'help' => t('Just a numeric field.'),
     'field' => array(
       'handler' => 'views_handler_field_numeric',
       'click sortable' => TRUE,
      ),
     'filter' => array(
       'handler' => 'views_handler_filter_numeric',
     ),
     'sort' => array(
       'handler' => 'views_handler_sort',
     ),
   );
 
   //  boolean поле.
   $data['example_table']['boolean_field'] = array(
     'title' => t('Boolean field'),
     'help' => t('Just an on/off field.'),
     'field' => array(
       'handler' => 'views_handler_field_boolean',
       'click sortable' => TRUE,
     ),
     'filter' => array(
       'handler' => 'views_handler_filter_boolean_operator',
       'label' => t('Published'),
       'type' => 'yes-no',
     ),
     'sort' => array(
       'handler' => 'views_handler_sort',
     ),
   );
 
   //  timestamp поле.
   $data['example_table']['timestamp_field'] = array(
     'title' => t('Timestamp field'),
     'help' => t('Just a timestamp field.'),
     'field' => array(
       'handler' => 'views_handler_field_date',
       'click sortable' => TRUE,
     ),
     'sort' => array(
       'handler' => 'views_handler_sort_date',
     ),
     'filter' => array(
       'handler' => 'views_handler_filter_date',
     ),
   );
 
   return $data;
 }

?>

*Если вы создали файл ***.views.inc после того как включили модуль, то чтобы views его увидел достаточно почистить кеш на стрнанице admin/build/views/tools

как видите во всех полях указан параметр handler – это обработчик который будет отрабатывать поля при выбранном действии.
В данном примере обработчики используются стандартные views -овские,
почитать документацию про стандартные обработчики можно здесь
так же можно с помощью хуков и ООП изменять обработчики
для этого:
в “handler” указываем следующее значение: ищем подходящий обработчик в документации и указываем вместо views_ имямодуля_,
для примера: вместо views_handler_filter_date, пишем example_handler_filter_date
затем указываем файл обработчика, используя hook_views_handlers():

<?phpfunction hook_views_handlers() {
  return array(
//указываем путь к файлу обработчика (только папку, в которой он лежит)
    'info' => array(
      'path' => drupal_get_path('module', 'example') .'/includes',
    ),
// в данном случае в папке "includes" должен лежать файл example_handler_filter_date.inc, содержащий обработчик
    'handlers' => array(
      'example_handler_filter_date' => array(
        'parent' => 'views_handler_filter_date',
      ),
    ),
  );
}?>

Про то, что должен содержать файл с обработчиком и другие hook-и views напишу в следующей статье.

ЗЫ: Если есть недочеты, надуюсь гуру поправят

Источник: http://www.drupal.ru/node/46007

© 2009 Обзор CMS