Как программно заполнить поле изображения в коллекции полей?
Я пытаюсь выполнить большой импорт, который сложнее, чем каналы, с которыми можно хорошо работать, поэтому я нахожусь в процессе написания пользовательского сценария импорта. Все работает, кроме загрузки изображений, связанных с помощью коллекции полей. У меня есть коллекция полей, которая содержит ссылки на узлы и таксономию, но мне не повезло с полем изображения.
У меня есть поле на узле под названием field_signature_media, которое ссылается на коллекцию полей, которая может быть разнообразие типов носителей. В коллекции полей у меня есть field_signature_image для обработки изображений.
Попытка первая: использование entity_metadata_wrapper:
// Image file created in earlier part of the process and loaded into $file
// The node that's being worked on has been created in $node
// Create the field collection
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_signature_media'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
$field = array('alt' => '',
'title' => '',
'fid' => $file->fid,
'display' => 1,
'width' => $file->image_dimensions['width'],
'height' => $file->image_dimensions['height'],
'image_field_caption' => array
(
'value' => '',
'format' => 'full_html',
),
);
$fc_wrapper->field_signature_image->set($field);
$fc_wrapper->save(true); // <-- at this point it enters infinite recursion.
field_attach_update('node', $node);
Вторая попытка без оболочки:
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_signature_media'));
$fc_item->field_signature_image[LANGUAGE_NONE][] =
array('alt' => '',
'title' => '',
'fid' => $file->fid,
'display' => 1,
'width' => $file->image_dimensions['width'],
'height' => $file->image_dimensions['height'],
'image_field_caption' => array
(
'value' => '',
'format' => 'full_html',
),
);
$fc_item->setHostEntity('node', $node);
$fc_item->save(TRUE);
field_attach_update('node', $node); // <-- At this point field_collection cannot find an array it was expecting.
Попытка три с оболочкой и без создания данных поля вручную:
$fc_item = entity_create('field_collection_item', array('field_name' => 'field_signature_media'));
$fc_item->setHostEntity('node', $node);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);
$fc_wrapper->field_signature_image->set($file->fid);
$fc_wrapper->save(true); // <-- at this point it enters infinite recursion.
field_attach_update('node', $node);
1 answers
Не должно быть никакой разницы между установкой поля на узле и элементом коллекции полей.
Это должно сработать
$fc_wrapper->field_signature_image->file->set($file);
Это также должно сработать
$fc_wrapper->field_signature_image = (array) $file;
Предполагая, что $file
является допустимым файловым объектом. Когда у меня возникают проблемы с добавлением файлов, обычно это происходит из-за того, что у меня отсутствует свойство. В этом случае я создам элемент сбора узлов и полей через пользовательский интерфейс, а затем dpm()
, чтобы посмотреть, чего нам не хватает. Половину времени это $file->display
, а остальное обычно $file->description
. Мой предполагаю, что $file->description
- это ваша проблема.
Чего я не помню, так это того, изменяет ли это использование Файловой сущности . Обе строки выше основаны на сценариях импорта, которые у меня есть, где этот модуль отключен.