Drupal → Добавляем в Views поддержку своих таблиц

09.07.2010

Простой пример того, как можно рассказать Views о своей таблице и сделать возможным выборку из этой таблицы.

В моём блоге у каждой заметки есть блок под названием Написанное актуально для (скриншот). Этот блок хранится в таблице versionfield и подключается при просмотре ноды в хуке hook_nodeapi. Структура таблицы:

CREATE TABLE `versionfield` (
  `nid` int(10) unsigned NOT NULL default 0,
  `version` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`nid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Её то мы и будем для примера подключать к Views.

Первым делом в основном файле модуля реализуем хук hook_views_api(), который сообщает Views о том, что мы хотим использовать его возможности. Функция должна возвращать версию Views API, которую использует модуль:

/**
 * Implements hook_views_api()
 */
function mymodule_views_api() {
  return array('api' => 2);
}

Дальше создаём в корне модуля файл имямодуля.views.inc и реализуем в нём хук hook_views_data():

/**
 * Реализация hook_views_data()
 */
function mymodule_views_data() {
  // подключаем к базовой таблице node, таблицу versionfield
  $data['versionfield']['table']['join']['node'] = array(
    'left_field' => 'nid', // ключевое поле из базовой таблицы, т.е из {node}
    'field' => 'nid',      // ключевое поле из подключаемой таблицы, т.е из {versionfield}
  );
    
  // рассказываем views о текстовом поле version из таблицы versionfield
  $data['versionfield']['version'] = array(
    'title'  => 'Написанное актуально для',
    'help'   => 'Версия скриптов используемых в заметке',
    'group'  => t('Node'),                                         // группа, к которой будет принадлежать поле
    'field'  => array('handler' => 'views_handler_field'),         // указываем на возможность добавлять поле в блоке Поля
    'sort'   => array('handler' => 'views_handler_sort'),          // указываем на возможность сортировки по этому полю в блоке Критерии сортировки
    'filter' => array('handler' => 'views_handler_filter_string'), // указываем на возможность фильтровать по этому полю в блоке Фильтры
  );
 
  return $data;
}

Очищаем кэш и пытаемся добавить новое поле к представлению:

Новое поле

Аналогичное поле появилось у критериев сортировки и фильтров.

Представление с новым полем:

Таблица построенная с помощью Views и с полем 'Версия' из стороннего модуля

Это очень простой пример использования Views API, рекомендую продолжить ознакомление по ссылкам:

Модуль Views — API. Основы
Views API часть 1 (подключаем свою таблицу)
Как подружить свой тип данных с Views
Developing With Views Part I: Describing your data to Views
Views online help: Views' API
Views 2 API Manual
Как связать сущность с модулем Views в Drupal

Подружить свою таблицу с Views можно и из админки — модуль Data.

Написанное актуально для
Views 2.x, Views 3.x
Похожие записи

Комментарии

graceman9
07.11.2011, 22:18

Отлично!!.. но.. как в условии своего фильтра использовать существующее поле выборки (td.tid), а не константное значение?

graceman9
07.11.2011, 22:54

фильтр views_handler_filter_term_node_tid почти подошел, на выходе мне надо:
WHERE mytable.tid = term_data.tid
похоже не судьба найти готовое

Alexander Borisenko
02.10.2012, 23:53

А у меня другая беда. Есть views (постороенный в UI) и нужно поменять базовую таблицу (с node на ссk), в целях значительного увеличения произодительность. Как это можно сделать???

Роман
16.06.2013, 09:52

Добрый день.

Скажите пожалуйста, каким образом настраивать $data['testnode']['table']['join'], если своя таблица является связывающей таблицей между базовыми, либо задает взаимосвязь между отдельными элементами внутри одной и той же базовой таблицы ?

Например, я задаю свою таблицу, которая задает связь между нодами (дочерняя - родительская) и имеет такую структуру:
nid - ID текущей ноды
nid_parent - ID родительской ноды

Есть ли возможность задать через $data['testnode']['table']['join'] не одну, а две связки ?

Первая - через поле nid, чтобы получить доступ к родительским нодам.
А вторая - через поле nid_parent, чтобы получить доступ к дочерним нодам.

И можно ли в таком случае связь с родительскими или дочерними нодами оформить во views как одно отношение ? Например,при задании отношений можно выбрать "Содержимое: родительские узлы" или "Содержимое: дочерние узлы", и будет получен доступ к полям родительских или дочерних узлов.

Константин
12.01.2018, 21:40

Подскажите, пожалуйста, а можно с помощью Views просто вывести свою таблицу, которая создана с помощью Database Schema без связывания с какой-то базовой таблицей? У меня просто нет связки ни с одной таблицей(во всех примерах, что нашёл это таблица Node).

Добавить комментарий