Drupal → Программно создать значение поля Field Collection

13.05.2014

Пример программного создания значения поля field_my_collection:

// Создаём объект коллекции (сущность типа field_collection_item для поля field_my_collection)
$collection_item = entity_create('field_collection_item', array('field_name' => 'field_my_collection'));

// Указываем родительскую сущность коллекции, например ноду c nid 123
$host_entity = node_load(123);
$collection_item->setHostEntity('node', $host_entity);

// Создаём враппер для коллекции
$collection_item_wrapper = entity_metadata_wrapper('field_collection_item', $collection_item);

// Заполняем поля у коллекции
$collection_item_wrapper->field_my_text_field = 'my test';
$collection_item_wrapper->field_my_term_field = 234;

// Сохраняем коллекцию
$collection_item_wrapper->save(TRUE);
Похожие записи

Комментарии

После всего этого, ноду тоже нужно сохранить.

Игорь
25.04.2015, 16:15
// Создаём объект коллекции (сущность типа field_collection_item для поля field_my_collection)
$collection_item = entity_create('field_collection_item', array('field_name' => 'field_my_collection'));
 
// Указываем родительскую сущность коллекции, например ноду c nid 123
$host_entity = node_load(123);
$collection_item->setHostEntity('node', $host_entity);

// Заполняем поля
$collection_item->field_my_text_field[LANGUAGE_NONE][] = array('value' => 'my test' );
$collection_item->field_my_term_field[LANGUAGE_NONE][] = array('value' => 234 );
 
// Сохраняем коллекцию
$collection_item->save();

Вот так вот работает ;-)
У меня с враппером ни чего не получилось - ошибка:
EntityMetadataWrapperException: Invalid data value given. Be sure it matches the required data type and format. в функции EntityMetadataWrapper->set()

Спасибо! Мне очень помогло.

А как программно удалить добавленное? Мне надо реализовать обновление по крону, которое должно заменять значения, но сейчас оно только бесконечно добавляет.

так же как и значение любого поля

А без node_save можно как-то обойтись при удалении значений filed collection? Дело в том что мне надо почистить добавленные в ноду field collection и выполнить код по их добавлению за один запуск php правила rules. Если использовать node_save, все что дальше игнорируется. Может быть можно как то использовать $collection_item->save(); при удалении..

А, все, можно не отвечать, просто надо было удалить node_save, рулс же сам сохраняет по окончании. В моем случае код такой:
$field_name = 'field_source';
$fc_items = field_get_items('node', $node, $field_name);
if (!isset($fc_items[0])) return;
foreach ($fc_items as $fc_item) {
entity_delete_multiple('field_collection_item', array($fc_item['value']));
}
$node->{$field_name} = array();
// node_object_prepare($node);
// node_save($node);

Xandeadx у меня так же как и у Игоря (ссылка на комент) возникала ошибка с кодом из статьи.

Кажется код Игоря более универсальный. Ваш код работал пока я создавал только текстовые поля, но когда я попытался создать Коллекцию с полем типа "Длинный текст" (многострочное текстовое поле) - возникала ошибка.

Добавить комментарий