Как установить значение поля файла с entity_metadata_wrapper

24

Как установить значение поля файла при использовании entity_metadata_wrapper?

Я пытался сделать это в коде:

$file = new stdClass();
$file->uid = 1;
$file->uri = $file_path;
$file->filename = basename($file_path);
$file->filemime = file_get_mimetype($file_path);
$file->filesize = filesize($file_path);
$file->status = FILE_STATUS_PERMANENT;
$file->display = '1';
file_save($file); // I also tried: $file = file_save($file);

$node = array(
  'type' => 'news_item',
  'uid' => 1,
  'status' => 1,
  'comment' => 0,
  'promote' => 0,
  'language' => 'en',
);

$entity = entity_create('node', $node);

$ewrapper = entity_metadata_wrapper('node', $entity);

$ewrapper->field_document->set((array) $file); // I also tried: $ewrapper->field_document->set($file);

$ewrapper->save(true);
entity_save('node', $entity);

Но я получаю это исключение:

EntityMetadataWrapperException: Invalid data value given. Be sure it matches the required data type and format. in EntityMetadataWrapper->set() (line 122 of C:\wamp\www\drupal\sites\all\modules\entity\includes\entity.wrapper.inc).

Любая помощь очень ценится.

СМО
источник

Ответы:

14

Мне кажется, что обертка массива файлов в другом массиве помогает мне:

$file = (array) $file;
$items = array($file);
$ewrapper->field_document->set($items);

Но я еще не выяснил, почему ...

Клайв
источник
Это действительно делает свое дело. Большое спасибо за вашу помощь, ценю это!
Смос
5
Я считаю, что это как-то связано с дельта-индексом месторождения. Если вы не назначаете дельта-индекс для своего поля (т. Е. $ Ewrapper-> field_name-> set ();), вы должны обернуть вокруг него другой массив. Если вы назначаете дельта-индекс для своего поля (то есть $ ewrapper-> field_name [0] -> set ();), вы можете просто использовать $ file = (array) $ file.
Смос
Да, это имеет большой смысл, спасибо за продолжение
Клайв
19

Ну, я только что нашел более простой и менее уродливый способ установки изображения .

$image_file = A FILE OBJECT; //Lot of choices here : new stdClass(), file_load, etc
$wrapper->FIELD_NAME->file->set($image_file);

Так же, как таксономия или ссылка на узел / сущность, имя поля файла указывает на загруженный объект, вот как я узнаю.


:: РЕДАКТИРОВАТЬ апостериори ::

Вот как бы я это сделал с OP вопросом.

// Get the file
$file = file_save_data(file_get_contents('/my_local_path/img1.jpg'), 'public://remote_name.jpg');

// Wrap' it like one of your French girls
$wrapper = entity_metadata_wrapper('node', $node);

// And set the photo
$wrapper->field_photo->file->set($file);

// And save the node
$wrapper->save();
JudaPriest
источник
Неустранимая ошибка: вызов функции-члена set () для нуля ... Я могу добавить некоторые текстовые поля, но добавить файл просто не работает
PatrickS
@PatrickS Вы уверены, что создали объект файла? Даже метод от Клайва не сработал?
JudaPriest
Я пытаюсь перенести часть контента Joomla в Drupal. При первом переносе файлов все работает. Если я удаляю все Продукты и пытаюсь выполнить другую миграцию, это больше не работает. Единственный способ заставить его работать с новой установки. Я сохранил данные Joomla в файле JSON, который я использую для создания сущностей. Когда я оставил комментарий, я еще не понял, что работает только первый импорт, и я пробовал все виды методов для создания сущностей. Я понятия не имел, что происходит, так как я смог создать все поля, кроме изображений!
PatrickS
1
new stdClass()Комментарий ввести в заблуждение меня немного, предполагая , что я мог бы назначить вновь созданный объект файла в поле непосредственно. При использовании этого убедитесь, что файлу назначен fid (т.е. он был сохранен хотя бы один раз), иначе это не будет работать.
Neograph734 31.12.15
Как бы вы применили это для нескольких файловых полей? Я думаю, что это должно быть что-то вроде, $wrapper->field_photo[]->file->set($file)но я не уверен. Вы когда-нибудь сталкивались с такой ситуацией?
Микель Корреа Касабланка
5

Мой узел уже существует, и мне пришлось установить следующие параметры:

$wrapper->field_pdf->set(array('fid'=>$fid, 'display'=>1, 'description'=>'This is a PDF'));

Полагаю, для разных настроек могут потребоваться разные параметры. Если вы посмотрите в журналах ошибок (admin / reports / dblog), вы увидите, какие параметры нужны.

gillarf
источник
1
Это сработало для меня. Я мог бы добавить поле файла без проблем, но оно не показывалось, как displayбыло 0по какой-то причине.
aross
0

На всякий случай кто-нибудь найдет это полезным:

Если у вас нет фактического дескриптора файла и fidвы знаете только то, что вы можете использовать:

$wrapper->field_file->set( array( 'fid'=>1234 ) );

И (при условии, что файл с таким fid существует) Drupal прикрепит правильный файл $wrapper->save().

reor
источник