Почему клерки так любят excel? Это очевидно. :)
В связи с этим, я заинтересовался есть ли решения для Drupal, которые позволяют вставить поле (или поля) в виде таблицы или сетки (grid), чтобы уменьшить пропасть, отделяющую удобный excel от работы с редактором публикаций в Drupal. Конечная цель — создать более дружественный интерфейс для редактора в админке.
Хочу рассказать об одном из таких модулей — tablefield.
Field Collection vs TableField
С точки зрения программиста, более правильно было бы использовать field collection, представляя каждую строку таблицы набором полей соответствующей коллекции.
Но чтобы привести внешний вид такой таблицы-коллекции в редакторе к ожидаемому пользователем виду (в виде таблички с примыкающими друг к другу полями) придется немало поработать.
В то время как TableField в редакторе и в шаблоне представляет поле в виде HTML таблицы.
Вторым неприятным аспектом работы с таблицей, реализованной как field collection, является громоздкий доступ к значением полей. Каждую строку нужно грузить как отдельный entity объект, а каждый столбец в этой строке-объекте — это сложно структурированное поле.
TableField же загружает данные поля в виде одного двухмерного массива.
Возможности TableField
Модуль позволяет работать с полями-таблицами.
Дефолтовый размеры сетки можно установить в настройках поля. Там же можно определить будет ли возможность у редактора изменять этот размер. Структурно размер сетки не ограничен определением поля, т.е. изменение сетки не влечет изменения определения поля в базе данных.
Плагин предоставляет редактору ряд сервисных возможностей — это импорт данных из CSV или простого текста с заданным разделителем полей.
Админ-настройки поля очевидны, чтобы останавливаться на их описании подробно. Лишь перечислю сами возможности. Можно:
- задать дефолтовы значения в таблице, и запретить их изменение в редакторе;
- выбрать тип ячейки — текстовое поле или область;
- ограничить длину вводимого в каждую ячейку текста.
Работа с tablefield из программного кода
Рассмотрим структуру поля. Вот как она выглядит:
Элемент value — это сериализованое значение, которое хранится в базе данных. Tabledata — данные в виде двухмерного массива. Обратите внимание на служебное значение weight в каждой строке (row).
Программно размеры сетки можно поменять, изменив значения в rebuild, установив нужные величины count_cols и count_rows. Значения ячеек можно менять как через value, так и меняя tabledata. Но содержимое value — приоритетное для обработчика, потому, если вы хотите чтобы читались изменения из tablefield, очищайте value при сохранении поля.
Ну и шаблон итератора для работы с таблицей:
1 2 3 4 5 6 7 8 9 10 11 |
$node = node_load($node_id); // получим значение поля-таблицы field_name list($tablefiled_value) = field_get_items('node', $node, 'field_name'); // ссылка на данные таблицы $table = &$tablefiled_value['tablefield']['tabledata']; // перебор строк в цикле foreach($table as $row) { // доступ к значению столбца $column_0 = $row['col_0']; ... } |