Як встановити значення файлового поля за допомогою_фабрики_____файла


24

Як встановити значення файлового поля при використанні ent_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 = (масив) $ файл.
Смос

Так, це має багато сенсу, дякую за продовження
Клайв

19

Ну щойно я виявив простіший і менш потворний вигляд способу встановити образ .

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

Так само, як я знаходжу таксономію чи посилання на вузол / сутність, ім'я поля файлу на завантаженому об'єкті.


:: EDIT a posteriori ::

Ось як я це зробив би з питанням про ОП.

// 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();

Фатальна помилка: виклик до набору функцій-учасників () у null ... Я можу додати кілька текстових полів, але додавання файлу просто не працює
PatrickS

@PatrickS Ви впевнені, що створили файл-об’єкт? Навіть метод від Клайва не працював?
JudaPriest

Я намагаюся перенести деякий вміст Joomla в Drupal. Перший раз, коли я переміщую файли, це працює. Якщо я стерю всі продукти і спробую іншу міграцію, вона більше не працює. Єдиний спосіб, як я змушую його працювати, - це з нової установки. Я зберігав дані Joomla у файлі JSON, який я використовую для створення об'єктів. На той момент, коли я залишив коментар, я ще не зрозумів, що працює лише перший імпорт, і я намагався всілякі методи створити сутність. Я поняття не мав, що відбувається, оскільки мені вдалося створити всі поля, крім зображень!
PatrickS

1
new stdClass()Коментар ввести в оману мене трохи, припускаючи , що я міг би призначити новостворений об'єкт файлу в поле безпосередньо. Використовуючи це, переконайтеся, що файлу призначено fid (тобто він був збережений хоча б один раз), інакше це не буде працювати.
Neograph734

Як би ви застосували це для кількох файлових полів? Я думаю, що це має бути щось на кшталт, $wrapper->field_photo[]->file->set($file)але я не впевнений. Ви коли-небудь стикалися з цією ситуацією?
Мікель Корреа Касабланка

5

Мій вузол вже існував, і мені довелося встановити наступні параметри:

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

Я думаю, що різні налаштування можуть вимагати різних параметрів. Якщо ви заглянете в свої журнали помилок (адміністратор / звіти / 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.