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


24

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.

Câu trả lời:


14

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 vẫn chưa tìm ra lý do tại sao ...


Điều đó thực sự làm các mẹo. Cảm ơn rất nhiều vì sự giúp đỡ của bạn, đánh giá cao nó!
Smos

5
Tôi tin rằng nó có một cái gì đó để làm với chỉ số delta của lĩnh vực. Nếu bạn không gán chỉ mục delta cho trường của mình (ví dụ $ ewrapper-> field_name-> set ();), bạn phải bọc một mảng khác xung quanh nó. Nếu bạn chỉ định một chỉ mục delta cho trường của bạn (ví dụ: $ ewrapper-> field_name [0] -> set ();), bạn chỉ có thể sử dụng tệp $ file = (mảng) $.
Smos

Vâng, điều đó rất có ý nghĩa, cảm ơn vì đã theo dõi
Clive

19

Vâng, tôi chỉ tìm ra một cách đơn giản và ít xấu xí hơn để thiết lập 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();

Lỗi nghiêm trọng: Gọi đến một hàm thành viên được đặt () trên null ... Tôi có thể thêm một số trường văn bản, nhưng thêm một tệp không hoạt động
PatrickS 7/07/2015

@PatrickS Bạn có chắc chắn đã tạo một đối tượng tệp? Ngay cả phương pháp từ Clive cũng không hiệu quả?
JudaPriest

Tôi đang cố gắng chuyển một số nội dung Joomla vào Drupal. Lần đầu tiên tôi di chuyển các tập tin, nó hoạt động. Nếu tôi xóa tất cả các Sản phẩm và thử di chuyển khác, nó sẽ không hoạt động nữa. Cách duy nhất tôi làm cho nó hoạt động là từ một bản cài đặt mới. Tôi đã lưu trữ dữ liệu Joomla trong một tệp JSON, mà tôi sử dụng để tạo các thực thể. Vào thời điểm tôi để lại nhận xét, tôi chưa nhận ra rằng chỉ có lần nhập đầu tiên hoạt động và tôi đã thử tất cả các phương thức để tạo các thực thể. Tôi không biết chuyện gì đang xảy ra vì tôi có thể tạo tất cả các trường, ngoại trừ hình ảnh!
PatrickS

1
Các new stdClass()bình luận lừa dối tôi một chút, giả sử tôi có thể gán một đối tượng tập tin mới được tạo ra để một lĩnh vực trực tiếp. Khi sử dụng, hãy đảm bảo tệp có fid được gán (nghĩa là nó đã được lưu ít nhất một lần), nếu không điều này sẽ không hoạt động.
Neograph734

Làm thế nào bạn sẽ áp dụng điều này cho nhiều trường tập tin? Tôi nghĩ nó nên như thế $wrapper->field_photo[]->file->set($file)nhưng tôi không chắc. Bạn đã bao giờ phải đối mặt với tình huống này?
Miquel Correa Casablanca

5

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.


1
Điều này làm việc cho tôi. Tôi có thể thêm trường tệp không có vấn đề, nhưng nó sẽ không hiển thị như display0vì một số lý do.
vào

0

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ó một tệp xử lý thực tế và chỉ biết fidbạ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 đúng tệp $wrapper->save().


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.