วิธีการตั้งค่าของฟิลด์ไฟล์ด้วย entity_metadata_wrapper


24

คุณจะตั้งค่าของฟิลด์ไฟล์อย่างไรเมื่อใช้เอนทิตี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);

แต่ฉันยังไม่ทราบสาเหตุ ...


นั่นจะเป็นการหลอกลวง ขอบคุณมากสำหรับความช่วยเหลือของคุณขอบคุณ!
Smos

5
ฉันเชื่อว่ามีบางอย่างเกี่ยวข้องกับดัชนีเดลต้าของฟิลด์ หากคุณไม่ได้กำหนดดัชนีเดลต้าให้กับเขตข้อมูลของคุณ (เช่น $ ewrapper-> field_name-> set ();) คุณจะต้องล้อมอาร์เรย์อีกรอบไว้ หากคุณกำหนดดัชนีเดลต้าให้กับฟิลด์ของคุณ (เช่น $ ewrapper-> field_name [0] -> set ();) คุณสามารถใช้ไฟล์ $ file = (อาร์เรย์) $
Smos

ใช่มันสมเหตุสมผลมากขอบคุณสำหรับการติดตาม
ไคลฟ์

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

ข้อผิดพลาดร้ายแรง: การเรียกไปยังชุดฟังก์ชันสมาชิก () เป็นโมฆะ ... ฉันสามารถเพิ่มฟิลด์ข้อความได้ แต่การเพิ่มไฟล์ไม่สามารถทำได้
PatrickS

@PatrickS คุณแน่ใจหรือว่าคุณสร้างวัตถุไฟล์? แม้แต่วิธีจากไคลฟ์ก็ใช้ไม่ได้เหรอ?
JudaPriest

ฉันกำลังพยายามโยกย้ายเนื้อหา Joomla ไปยัง Drupal ครั้งแรกที่ฉันย้ายไฟล์มันทำงานได้ หากฉันลบผลิตภัณฑ์ทั้งหมดและลองย้ายข้อมูลอีกครั้งมันจะไม่ทำงานอีกต่อไป วิธีเดียวที่ฉันทำให้มันทำงานได้คือจากการติดตั้งใหม่ ฉันได้จัดเก็บข้อมูล Joomla ในไฟล์ JSON ซึ่งฉันใช้เพื่อสร้างเอนทิตี ในขณะที่ฉันแสดงความคิดเห็นฉันยังไม่ได้ตระหนักว่ามีเพียงการนำเข้าครั้งแรกเท่านั้นที่ใช้งานได้ & ฉันได้ลองวิธีการทั้งหมดเพื่อสร้างเอนทิตี ฉันไม่รู้ว่าเกิดอะไรขึ้นตั้งแต่ฉันสามารถสร้างฟิลด์ทั้งหมดยกเว้นภาพ!
PatrickS

1
new stdClass()คิดเห็นเข้าใจผิดเล็ก ๆ น้อย ๆ ผมสมมติว่าผมสามารถกำหนดวัตถุไฟล์ที่สร้างขึ้นใหม่เพื่อให้ข้อมูลโดยตรง เมื่อใช้สิ่งนี้ตรวจสอบให้แน่ใจว่าไฟล์มีการกำหนด fid (เช่นบันทึกอย่างน้อยหนึ่งครั้ง) มิฉะนั้นจะไม่สามารถใช้งานได้
Neograph734

คุณจะใช้สิ่งนี้กับหลายไฟล์ได้อย่างไร? ฉันคิดว่ามันควรจะเป็นสิ่งที่ชอบ$wrapper->field_photo[]->file->set($file)แต่ฉันไม่แน่ใจ คุณเคยเผชิญกับสถานการณ์นี้หรือไม่?
Miquel Correa Casablanca

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()จะแนบไฟล์ที่ถูกต้องเมื่อ


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 บันทึก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.