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

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

Любая помощь очень приветствуется mych.

23 голоса | спросил Smos 10 PMpWed, 10 Apr 2013 17:42:02 +040042Wednesday 2013, 17:42:02

5 ответов


14

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

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

Но я еще не обнаружил почему ...

ответил Clive 10 PMpWed, 10 Apr 2013 19:35:55 +040035Wednesday 2013, 19:35:55
18

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

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

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


:: EDIT a posteriori ::

Вот как бы я сделал это с вопросом 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 21 J000000Monday14 2014, 11:53:31
5

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

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

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

ответил gillarf 18 PM00000020000003231 2014, 14:31:32
0

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

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

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

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

ответил reor 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 19 Sep 2016 23:49:50 +0300 2016, 23:49:50
0

У вас есть два способа сделать это:

// By loading the file object in any way
$file_obj = file_load($fid);
$w_containing_node->field_attachment_content->file->set( $file_obj );


// By passing an array with the fid
$w_containing_node->field_attachment_content->set( array('fid' => $fid) );

Вот источник информации: https://www.drupal.org/docs/7/api/entity-api/entity-metadata-wrappers#example-value-set-save

ответил romain ni 25 +03002016-10-25T11:04:00+03:00312016bEurope/MoscowTue, 25 Oct 2016 11:04:00 +0300 2016, 11:04:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132