Простой пример того, как можно рассказать 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 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 сортировка по выражению/условию/формуле
- Необязательное значение одной из дат в раскрытом фильтре с оператором BETWEEN
- Как расширить функционал фильтр-плагина Views? (добавляем возможность фильтровать числовые поля по нескольким значениям)
- Экспорт представления Views в код
- Программно добавить шапку или подвал в представление
Комментарии
Отлично!!.. но.. как в условии своего фильтра использовать существующее поле выборки (td.tid), а не константное значение?
фильтр
views_handler_filter_term_node_tid
почти подошел, на выходе мне надо:WHERE mytable.tid = term_data.tid
похоже не судьба найти готовое
А у меня другая беда. Есть views (постороенный в UI) и нужно поменять базовую таблицу (с node на ссk), в целях значительного увеличения произодительность. Как это можно сделать???
Добрый день.
Скажите пожалуйста, каким образом настраивать $data['testnode']['table']['join'], если своя таблица является связывающей таблицей между базовыми, либо задает взаимосвязь между отдельными элементами внутри одной и той же базовой таблицы ?
Например, я задаю свою таблицу, которая задает связь между нодами (дочерняя - родительская) и имеет такую структуру:
nid - ID текущей ноды
nid_parent - ID родительской ноды
Есть ли возможность задать через $data['testnode']['table']['join'] не одну, а две связки ?
Первая - через поле nid, чтобы получить доступ к родительским нодам.
А вторая - через поле nid_parent, чтобы получить доступ к дочерним нодам.
И можно ли в таком случае связь с родительскими или дочерними нодами оформить во views как одно отношение ? Например,при задании отношений можно выбрать "Содержимое: родительские узлы" или "Содержимое: дочерние узлы", и будет получен доступ к полям родительских или дочерних узлов.
http://views-help.doc.logrus.com/help/views/api-tables
Подскажите, пожалуйста, а можно с помощью Views просто вывести свою таблицу, которая создана с помощью Database Schema без связывания с какой-то базовой таблицей? У меня просто нет связки ни с одной таблицей(во всех примерах, что нашёл это таблица Node).
hook_views_api + hook_views_data
Да, точно.
https://drupal.stackexchange.com/questions/149243/hook-views-data-witho…
https://gist.github.com/mankyKitty/5897786
вот по этим примерам получилось.
Добавить комментарий