Jak ustawić wartość pola pliku za pomocą podmiotu_metadanych_wrapper

24

Jak ustawić wartość pola pliku, gdy używasz podmiot_metadanych_wrapper?

Próbowałem zrobić to w kodzie:

$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);

Ale dostaję ten wyjątek:

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).

Każda pomoc jest bardzo mile widziana.

Smos
źródło

Odpowiedzi:

14

Wydaje mi się, że zawijanie tablicy plików w inną tablicę:

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

Ale nie dowiedziałem się jeszcze, dlaczego ...

Clive
źródło
To rzeczywiście załatwia sprawę. Bardzo dziękuję za pomoc, doceniam to!
Smos
5
Uważam, że ma to coś wspólnego ze wskaźnikiem delta pola. Jeśli nie przypiszesz indeksu delta do swojego pola (tj. $ Ewrapper-> nazwa_pola-> set ();), musisz owinąć wokół niego kolejną tablicę. Jeśli przypiszesz indeks delta do swojego pola (tj. $ Ewrapper-> nazwa_pola [0] -> set ();), możesz po prostu użyć $ file = (array) $ file.
Smos
Tak, to ma sens, dziękuję za kontynuację
Clive
19

Właśnie znalazłem prostszy i mniej brzydki sposób ustawiania obrazu .

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

Podobnie jak odniesienie do taksonomii lub węzła / encji, nazwa pola pliku wskazuje na załadowany obiekt, tak właśnie się dowiaduję.


:: EDYCJA a posteriori ::

Tutaj, jak bym to zrobił z pytaniem 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
źródło
Błąd krytyczny: wywołanie funkcji składowej set () w wartości null ... Mogę dodać pola tekstowe, ale dodanie pliku po prostu nie działa
PatrickS
@PatrickS Na pewno utworzyłeś obiekt pliku? Nawet metoda z Clive nie zadziałała?
JudaPriest
Próbuję przeprowadzić migrację części Joomla do Drupala. Przy pierwszej migracji plików działa. Jeśli wymażę wszystkie Produkty i podejmę próbę ponownej migracji, nie będzie to już działać. Jedyny sposób, w jaki mogę go uruchomić to nowa instalacja. Przechowałem dane Joomla w pliku JSON, którego używam do tworzenia encji. Kiedy zostawiłem komentarz, jeszcze nie zdawałem sobie sprawy, że działa tylko pierwszy import i próbowałem różnych metod tworzenia bytów. Nie miałem pojęcia, co się dzieje, ponieważ udało mi się stworzyć wszystkie pola oprócz obrazów!
PatrickS
1
new stdClass()Komentarz zmylić mnie trochę, zakładając, że mogę przypisać nowo utworzony obiekt pliku do pola bezpośrednio. Korzystając z tego, upewnij się, że plik ma przypisany identyfikator FID (tj. Został zapisany co najmniej raz), w przeciwnym razie nie zadziała.
Neograph734,
Jak zastosowałbyś to do pola wielu plików? Myślę, że tak powinno być, $wrapper->field_photo[]->file->set($file)ale nie jestem pewien. Czy kiedykolwiek spotkałeś się z tą sytuacją?
Miquel Correa Casablanca
5

Mój węzeł już istniał i musiałem ustawić następujące parametry:

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

Różne konfiguracje mogą wymagać różnych parametrów. Jeśli spojrzysz na swoje dzienniki błędów (admin / raporty / dblog), zobaczysz, jakie parametry są potrzebne.

gillarf
źródło
1
To zadziałało dla mnie. Mógłbym dodać polu Plik nie ma problemu, ale nie byłoby pokazać jak displaybyło 0z jakiegoś powodu.
aross
0

Na wypadek, gdyby ktoś uznał to za pomocne:

Jeśli nie masz rzeczywistego uchwytu pliku i znasz tylko to, fidczego możesz użyć:

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

I (zakładając, że istnieje plik z tym identyfikatorem) Drupal załączy poprawny plik $wrapper->save().

reor
źródło