Как установить значение поля файла с 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();

Неустранимая ошибка: вызов функции-члена 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), вы увидите, какие параметры нужны.


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

0

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

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

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.