xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Пример программного создания значения поля 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);
Похожие записи

Комментарии RSS

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

Нет, в данном случае не нужно.

// Создаём объект коллекции (сущность типа 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()

Нашел ещё хороший код https://www.drupal.org/node/1842304#comment-9295475

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

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

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

ок, спасибо

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

попробуйте $collection_item->delete()

А, все, можно не отвечать, просто надо было удалить 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);

Спасибо :)

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании