Как предварительно заполнить поля коллекции полей в Drupal 7?

У меня есть тип контента, который может содержать неограниченное количество экземпляров встроенной коллекции полей field_foo, каждая из которых содержит два поля: field_foo_bar и field_foo_baz.

Я хочу изменить форму создания узла для этого типа контента, чтобы предварительно заполнить field_foo значениями из того же поля на существующем узле.

По умолчанию форма создания узла имеет:

FIELD FOO

FOO BAR [            ]
FOO BAZ [            ]

... и я хотел бы установить, например:

FIELD FOO

FOO BAR [Bar value #1]
FOO BAZ [Baz value #1]

FOO BAR [Bar value #2]
FOO BAZ [Baz value #2]

Как я могу это сделать? Я чувствую, что упускаю что-то прямолинейное.

Я попытался просто клонировать пустую коллекцию полей в hook_form_alter() и изменить значения field_foo_bar и field_foo_baz в соответствии с требованиями, но это вызывает проблемы с добавлением/удалением строк и настройкой нескольких дельт, весов и т. д., создается впечатление, что я лаю неправильно дерево.


person scronide    schedule 10.01.2013    source источник


Ответы (2)


Поскольку коллекции полей на самом деле являются сущностями, не могли бы вы использовать hook_entity_insert(), чтобы проверить, является ли вставляемая сущность экземпляром вашей коллекции полей, и если да, установите значения.

person 2pha    schedule 11.01.2013

hook_form_alter — правильный способ сделать это. Если возникают другие проблемы, это связано с тем, что вы неправильно заполняете поле или потому, что другой модуль также редактирует поля после вас. В первом случае проверьте формат поля в hook_node_insert. В последнем случае измените вес вашего модуля, чтобы он запускался последним и ваши изменения перезаписывали любые другие модули.

person danielson317    schedule 11.01.2013
comment
Основным камнем преткновения является то, что коллекции полей на самом деле являются встроенными объектами. hook_node_insert() перечисляет только массив идентификаторов объектов field_collection_item, созданных во время отправки; там нет прямого доступа к значениям его дочерних элементов, и нет экземпляров сущностей или полей, на которые можно ссылаться в новой форме. - person scronide; 11.01.2013
comment
Информация о поле должна быть в форме в некоторых точках. Возможно, вам просто нужно увеличить вес модуля, чтобы увидеть это. Из того, что я вижу в коде, field_collection — ужасный модуль. Вместо этого попробуйте field_group. он использует гораздо лучшую философию для группировки полей вместе. - person danielson317; 12.01.2013
comment
Это, безусловно, есть в hook_form_alter(), но это массив сущностей, которые являются массивами полей, и это непрозрачная мешанина значений, весов и дельт. Нет простого способа сказать, что использовать значения этой коллекции полей в качестве #default_value этой другой коллекции полей, на что я и надеялся. Я также использую группу полей, но это возможность добавлять или удалять повторяющиеся мультигруппы/гибкие группы/наборы полей, которые мне нужны, а группа полей явно не предоставляет этого. - person scronide; 12.01.2013