Иногда при работе с Drupal возникает необходимость оформить ввод набора однотипных данных — например, списка характеристик, параметров или цен — не в виде длинного списка полей, а в виде таблицы.
Самое очевидное решение — установить модуль TableField, который позволяет добавлять в материал таблицу с произвольным числом строк и столбцов. На первый взгляд это удобно: пользователь видит знакомую таблицу, может добавлять и удалять строки, менять порядок столбцов. Однако при реальной работе у TableField обнаруживаются ограничения, из-за которых его применение часто оказывается ошибкой.
Почему TableField не подходит
Главная проблема TableField заключается в отсутствии типизации столбцов. Все ячейки в нём — это просто текст, хранящийся в сериализованном массиве или JSON-формате. Drupal не знает, что в одном столбце должны быть числа, а в другом ссылки на термины. Невозможно использовать валидацию, автодополнение, числовые ограничения, виджеты для выбора таксономий. Все данные превращаются в безымянные строки.
Кроме того, TableField не использует систему сущностей Drupal. Это означает:
- нельзя сделать ревизии отдельных строк;
- нельзя подключить перевод для конкретной ячейки;
- нельзя фильтровать или искать по отдельным значениям таблицы;
- невозможно удобно переиспользовать эти данные в других контекстах.
Вернее будет сказать, что всё это можно сделать через кастомную реализацию.
По сути, TableField хранит массив сырых данных, не интегрированных с остальной структурой сайта. Это подходит для простых справочных таблиц, но не для чего-то, что должно жить внутри контентной модели Drupal.
Решение через Paragraphs
Если таблица нужна не как декоративный элемент, а как способ редактирования набора однотипных записей, то гораздо правильнее реализовать её через Paragraphs.
Для этого создаётся параграфный тип, например row_item
. В нём можно задать поля с нужной типизацией, например: field_label
(текст), field_value
(число) и field_category
(ссылка на термин). Каждое поле получает собственный тип данных, Drupal может его валидировать, переводить и выводить.
Далее в нужном типе материала добавляется поле типа Paragraphs с множественными значениями. Оно будет хранить набор строк, где каждая строка — это отдельный параграф row_item
.
Такой подход остаётся полностью совместимым с остальной системой сущностей. Любая строка таблицы — отдельная сущность с собственными правами, ревизиями, мультиязычностью и типами данных.
Вот пример поля-таблицы с комплектацией.

Здесь можно задавать для каждой «строки» наименование (текст), выбирать из словаря ед. изм и указывать кол-во (число).
Теперь решим визуальную задачу компактного представления строк.
Компактное редактирование через Field Group
Чтобы форма редактирования не превращалась в длинный список полей, используется модуль Field Group (field_group). Он позволяет сгруппировать поля параграфа и управлять их расположением.
В разделе Structure → Paragraphs → Row item → Manage form display создаётся новая группа, например Row layout
. В качестве контейнера выбирается Div, а внутрь группы перетаскиваются все поля параграфа.
У группы можно задать атрибуты, чтобы поля располагались в одну строку:
1 |
style="display: flex; gap: 24px; flex-wrap: wrap;" |
Теперь каждое значение параграфа выглядит в форме как аккуратная строка таблицы, где столбцы — это поля разных типов: текст, число, термин. Можно добавлять и удалять строки, менять порядок, при этом система полностью сохраняет типизацию и валидность данных.
Еще я прячу название параграфа, которое идет с каждой строкой (добавляя стили в тему администрирования).

Использование Paragraphs и Field Group позволяет создать лёгкий аналог TableField, который не ломает архитектуру Drupal.
Каждый столбец получает свой тип данных, каждая строка — собственную сущность. Можно подключать валидацию, автодополнение, мультиязычность и отображать эти данные в любом виде. При этом сама форма редактирования остаётся интуитивной и компактной, без кастомных модулей или лишнего кода.