it-swarm-vi.com

Cách đặt giá trị của trường tệp bằng entity_metadata_wrapper

Làm thế nào để bạn đặt giá trị của một trường tệp khi sử dụng entity_metadata_wrapper?

Tôi đã thử làm điều này trong 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);

Nhưng tôi nhận được ngoại lệ này:

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

Bất kỳ trợ giúp là rất mych đánh giá cao.

24
Smos

Gói mảng tệp trong một mảng khác dường như thực hiện mẹo cho tôi:

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

Nhưng tôi chưa tìm ra tại sao chưa ...

14
Clive

Chà, tôi vừa tìm ra một cách đơn giản và ít xấu xí hơn để đặt hình ảnh.

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

Cũng giống như phân loại hoặc tham chiếu nút/thực thể, tên trường tệp điểm trên một đối tượng được tải, đó là cách tôi tìm hiểu.


:: EDIT một posteriori ::

Ở đây làm thế nào tôi có thể làm điều đó với câu hỏi 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();
19
JudaPriest

Nút của tôi đã tồn tại và tôi phải đặt các tham số sau:

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

Tôi cho rằng các thiết lập khác nhau có thể yêu cầu các tham số khác nhau. Nếu bạn nhìn vào nhật ký lỗi của mình (admin/báo cáo/dblog), bạn có thể thấy những tham số nào là cần thiết.

5
gillarf

Chỉ trong trường hợp bất cứ ai sẽ thấy điều này hữu ích:

Nếu bạn không có xử lý tệp thực tế và chỉ biết fid bạn có thể sử dụng:

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

Và (giả sử một tệp có fid đó tồn tại) Drupal sẽ đính kèm tệp chính xác khi $wrapper->save().

1
reor

Bạn có hai cách để làm điều đó:

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

Đây là nguồn thông tin: https://www.drupal.org/docs/7/api/entity-api/entity-metadata-wrappers#example-value-set-save

0
romain ni