Entity_metadata_wrapper ile dosya alanının değeri nasıl ayarlanır?


24

Entity_metadata_wrapper kullanırken bir dosya alanının değerini nasıl belirlersiniz?

Bunu kodda yapmaya çalıştım:

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

Ancak bu istisnayı alıyorum:

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

Herhangi bir yardım çok mych takdir edilmektedir.

Yanıtlar:


14

Dosya dizisini başka bir diziye sarmak benim için hile yapmak gibi görünüyor:

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

Ama nedenini henüz anlamadım.


Bu gerçekten hile yapar. Yardımlarınız için çok teşekkürler, takdir edin!
Smos

5
Alanın delta indeksi ile bir ilgisi olduğuna inanıyorum. Alanınıza bir delta indeksi atamazsanız (yani $ ewrapper-> field_name-> set ();), etrafına başka bir dizi sarmanız gerekir. Alanınıza bir delta indeksi atarsanız (yani $ ewrapper-> field_name [0] -> set ();), sadece $ file = (array) $ dosyasını kullanabilirsiniz.
Smos

Evet, bu çok mantıklı, takip ettiğiniz için teşekkürler
Clive

19

Ben sadece görüntü ayarlamak için daha basit ve daha az çirkin görünümlü bir yol öğrendim .

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

Aynen taksonomi veya düğüm / varlık referansı gibi, dosya alanı adı yüklü bir nesneye işaret eder, nasıl bulduğumu.


:: Bir posteriori EDIT ::

İşte OP sorusuyla nasıl yapardım.

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

Önemli hata: null üzerinde set () bir üye işlevine çağrı yapın ... Bazı metin alanları ekleyebiliyorum, ancak bir dosya eklemek işe yaramıyor
PatrickS

@PatrickS Bir dosya nesnesi oluşturduğunuzdan emin misiniz? Clive'den bile yöntem işe yaramadı mı?
JudaPriest

Bazı Joomla içeriğini Drupal'a taşımaya çalışıyorum. Dosyaları ilk kez geçirdiğimde çalışıyor. Tüm Ürünleri silip başka bir geçiş yapmaya çalışırsam, artık işe yaramıyor. Çalışmamın tek yolu yeni bir kurulum. Joomla verilerini, varlıkları oluşturmak için kullandığım bir JSON dosyasında sakladım. Yorumdan ayrıldığımda, sadece ilk ithalatın çalıştığını henüz fark etmemiştim ve varlıkları oluşturmak için her türlü yöntemi deniyordum. Görüntüler hariç tüm alanları oluşturabildiğimden beri neler olduğu hakkında hiçbir fikrim yoktu!
Patrick,

1
new stdClass()Yorum doğrudan bir alana yeni oluşturulan dosya nesnesi atayabilirsiniz varsayarak bana biraz yanıltmak. Bunu kullanırken, dosyanın atanmış bir bilgisi olduğundan emin olun (yani en az bir kez kaydedildi), aksi halde bu işe yaramaz.
Neograph734

Bunu birden fazla dosya alanı için nasıl uygularsınız? Bunun gibi bir şey olması gerektiğini düşünüyorum $wrapper->field_photo[]->file->set($file)ama emin değilim. Bu durumla hiç karşılaştınız mı?
Miquel Correa Kazablanka

5

Düğüm zaten vardı ve aşağıdaki parametreleri ayarlamak zorunda kaldım:

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

Farklı ayarlar sanırım farklı parametreler gerektirebilir. Hata günlüklerine bakarsanız (admin / report / dblog) hangi parametrelerin gerekli olduğunu görebilirsiniz.


1
Bu benim için çalıştı. Ben dosya sahadan sorun eklemek olabilir, ama gibi göstermek olmaz displayoldu 0nedense.
saat

0

Birisinin bunu faydalı bulması durumunda:

Gerçek bir dosya tanıtıcınız yoksa ve yalnızca fidkullanabileceğinizi biliyorsanız :

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

Ve (bu yardım dosyasıyla bir dosyanın var olduğunu varsayarak) Drupal doğru dosyayı ekleyecektir $wrapper->save().


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.