УрокДобавление своей таблицы в качестве поля во Views
Не так давно попалось мне забавное задание - написать поиск по всем полям одного типа материала, включая приложенные файлы. Решил всё делать через раскрытые фильтры Views (exposed filters). И всё бы по всем полям ищет прекрасно - текстовые, таксономия, числовые. Но вот с загруженными файлами возникла проблема - по ним-то Views не бегает.
Решение пришло довольно быстро - надо писать свой модуль, который ложит содержимое файла в отдельную таблицу и потом подключить к этой таблице Views. Процедуру вытягивания информации из доков я пропущу, а вот на подключении таблицы остановлюсь подробнее.
Итак, в .install файле модуля я описал будущую таблицу:
/** * Implements hook_schema(). */ function example_schema() { $schema['example_attached_file'] = array( 'fields' => array( 'nid' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'text' => array( 'type' => 'text', 'size' => 'big', 'not null' => TRUE, ), ), 'primary key' => array('nid'), ); return $schema; }
Таблица простейшая - nid материала, для которого загружен документ, и текст самого документа.
Далее в файле .module я описал хук, который сообщает Views о том, что я собираюсь интегрировать с ним свой модуль, вернув версию API для него:
/** * Implements hook_views_api(). */ function example_views_api(). { return array('api' => 3); }
Дальше реализуется хук с набором данных для Views:
/** * Implements hook_views_data(). */ function example_views_data() { // Здесь идёт связывание моей таблицы с таблицей {node} по ключу nid. // Т.е. будет формироваться дополнительное условие вида // LEFT JOIN {example_attached_file} ON node.nid = example_attached_file.nid $data['example_attached_file']['table']['join']['node'] = array( 'left_field' => 'nid', // Поле (ключ) из таблицы {node} 'field' => 'nid', // Поле (ключ) из таблицы {example_attached_file} ); // Теперь указываем поле с данными, которое будет выводиться на экран $data['example_attached_file']['text'] = array( 'title' => 'Текст приаттаченого документа', 'help' => 'Содержимое приаттаченого документа', 'group' => t('Node'), // Группа, в которой будет отображаться поле 'filter' => array('handler' => 'views_handler_filter_string'), // Добавляем возможность фильтровать по этому полю 'field' => array('handler' => 'views_handler_field'), // Добавляем возможность добавлять значение этой колонки как поле во Views ); return $data; }
Вот и всё решение. Далее я выбрал своё свежедобавленное поле во Views в качестве фильтра , раскрыл его, и получил необходимый результат.
Кстати, к текстовому полю можно было добавить, например, возможность сортировки по нему. Для этого надо было при его описании добавить вот эту строчку:
'sort' => array('handler' => 'views_handler_sort');
Полный список возможных обработчиков полей (handlers) вы можете найти в папке handlers модуля Views.
- Spleshka
- 27.10.2011
- 10153
Комментарии
Круто, даже очень, но не помешал бы, полный исходный файл в зип))))))))))
А можно к своему полю ДАТА прикрутить виджет Date_popup чтобы при использовании его в качестве фильтра во Views вводить туда дату из календаря
Комментировать