Программное создание и обновление полей типа field collection

Field Collection - удобный модуль, который позволяет создавать составные поля, То есть поля, которые содержат внутри себя другие поля. Например, это может быть поле, состоящее из двух разных полей - термина таксономии и числовое поле. В этой статье мы поговорим о программном создании экземпляров field collection добавлении их к ноде, а также, о программном редактировании Field Collection в Drupal.

Предположим, что у нас есть нода с id 10, и нам нужно добавить к ней поле типа field_collection, состоящее из полей field_collection_field1 и field_collection_field2.

$node = node_load(10);
 
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_collection_name')); // field_collection_name заменяем на название своего поля типа field collection
$field_collection_item->setHostEntity('node', $node);  
 
$field_collection_item->field_collection_field1[LANGUAGE_NONE][0]['tid'] = 'Значение первого составного поля';
$field_collection_item->field_collection_field2[LANGUAGE_NONE][0]['value'] = 'Значение второго составного поля';
$field_collection_item->save();

Для обновления значения существующего поля типа field collection ноды с nid 10 используем следующий код:

$node =node_load(10);
 
// Получаем значение поля field collection
$field_collection_item_value = $node->field_collection1[LANGUAGE_NONE][0]['value'];
 
// Загружаем экземпляр field collection и изменяем его значение
$field_collection_value = entity_load('field_collection_item', array($field_collection_item_value));
 $field_collection_value->field_collection1[LANGUAGE_NONE][0]['value'] = 'updated value here';
 
 // Сохраняем изменения
$field_collection_value->save();

Для удаления существующего field collection поля используем следующий код:

$node = node_load(10);
 
// Получаем значение поля.
$field_collection_item_value = $node-?-->field_collection1[LANGUAGE_NONE][0]['value'];
 
 // Удаляем экземпляр поля.
entity_delete_multiple('field_collection_item', array($field_collection_item_value));