Терминология не устоялась, все называют subject по-разному: составные поля, множественные поля, коллекции полей, мультиполя, зависимые поля… Эту же неразбериху можно проследить в названиях проектов модулей и обсуждениях на сайте drupal.org.
Всё это определения возможности создания объединенных в одно поле двух и более атомарных полей. Лично мне нравится термин — «составное поле».
О конструкторе полей
Конструктор полей — одна из популярных фишек друпала. В паре с созданием типов публикаций это дает широкие возможности для развития структуры объектов, которыми управляет CMS. Ирония в том, что до 7-й версии ядра задача конструктора полей лежала на сторонних модулях, самый известный из которых — CCK.
В 7-ке разработчики включили конструктор полей в комплект поставки движка. Они не стали перегружать базовый функционал, конструктор остался плоским, как и ранее в CCK. Т.е. составные поля в «Drupal 7 из коробки» делать нельзя.
Семерка вышла пять лет назад (5 января 2011), но пока мододелы и энтузиасты не смогли сделать на все 100% рабочий модель для создания составных полей. Я расскажу о паре таких модулей — это проекты Multifield и Field Collection.
Multifield модуль
Страница проекта — www.drupal.org/project/multifield
Я сомневался, стоит ли качать альфа версию и пытаться пользоваться. Не понимаю : зачем выкладывать проекты в далеком от готовности состоянии? Скачать меня убедил авторский ролик о модуле. Мне удалось повторить все этапы из ролика (кое что там уже не соответствует действительности), и получить требуемый результат — спроектировать множественное поле, собрав его из базовых атомарных кирпичиков.
Текущая версия — 7.x-1.0-alpha1 на столько сырая, что от использования модуля в итоге пришлось отказаться. Обнаруженные проблемы:
- Поля image глючат, если в них не загрузить картинку;
- Если определено хоть одно значение составного поля, то структуру, набор полей уже нельзя изменять.
Значения у каждого атомарного поля в составе коллекции может быть только 1, но это не частая потребность, так что можно с этим мириться.
Мне понравилось, что модуль загружает значения мультиполя как и прочие поля в объект ноды. Дополнительных манипуляций не требуется. Все данные атомарных полей пишутся в соответствующую таблицу составного поля. Модуль работает с коллекцией так, как будто это одно поле с несколькими разными параметрами.
Field Collection модуль
Страница проекта — www.drupal.org/project/field_collection
Данный модуль гораздо богаче по возможностям. Версия 7.x-1.0-beta11 позволяет создавать коллекции из коллекций, и не ограничивает кол-во атомарных значений. Предлагается полная свобода в конструировании составных полей.
Модуль использует Entity API. Каждый экземпляр составного поля — это ещё один объект, сравнимый по сложности с публикацией. При загрузке ноды, данные коллекции полей не загружаются автоматически. Например, в шаблоне вам придется догружать их самостоятельно.
В примере грузятся данные составного поля field_bg2:
1 2 |
$node = node_load($nid); $collection = field_collection_item_load($node->field_field_bg2['und'][0]['value']); |
Не такие уж большие неудобства. С критическими ошибками при использовании модуля я не столкнулся, несмотря на beta статус. После ввода данных, конструктор не ограничивает модификацию структуры полей.