Làm cách nào để lấy URI tệp từ đối tượng EntityMetadataWrapper?


11

Việc nắm giữ các đối tượng tệp liên quan đến các nút thông qua một trường rất dễ dàng bằng cách sử dụng EntityMetadataWrapper:

$wrapper = entity_metadata_wrapper('node', $node);
$images = $wrapper->field_images;

Thật tuyệt vời Tuy nhiên, tôi muốn sử dụng một số thuộc tính của đối tượng tệp tiêu chuẩn và chúng không có sẵn. Khi tôi nhìn vào các thuộc tính có sẵn khi $images[0]->filesử dụng đoạn mã trên, tôi thấy những điều sau:

  • fid
  • Tên
  • kịch câm
  • kích thước
  • url
  • dấu thời gian
  • chủ nhân

Đáng chú ý nhất urilà thiếu, và ở vị trí của nó có một thuộc urltính, đó là URL bên ngoài đầy đủ cho tệp hình ảnh. Tôi muốn thao tác với những hình ảnh này thông qua URI của chúng (tạo ngón tay cái, v.v.), vì vậy tôi sẽ làm điều này:

$fid = $images[0]->file->fid->value();
$uri = file_load($fid)->uri;

Mà dường như phủ nhận toàn bộ quan điểm của việc sử dụng một EntityMetadataWrapperở nơi đầu tiên.

Tôi đang thiếu gì? URI trên đối tượng tập tin được bọc ở đâu? Nếu nó không có sẵn, vì tình yêu của tất cả những điều tốt đẹp và tinh khiết, tại sao không?!

Tôi biết rằng tôi có thể giải cấu trúc URL trở lại URI, nhưng điều đó cũng cảm thấy rất không cần thiết.


1
Bạn đang sử dụng file_entity?
mpdon Arena

@MPD Ahhhh, cuộc gọi tuyệt vời, không tôi không ... có lẽ tôi không nên mong đợi để xem những gì tôi coi là 'thuộc tính' nếu đối tượng không hoạt động như một thực thể. Mặc dù vậy, URL có vẻ là một lựa chọn lạ thay vì URI cho các mô-đun Thực thể đã chọn. Nếu câu trả lời là "bạn sẽ cần phải thực hiện hook_entity_property_info_alter()" thì tốt thôi, chỉ muốn biết
Clive

Tôi thực sự không chắc chắn điều đó sẽ tạo ra sự khác biệt hay không, nhưng việc kích hoạt mô-đun đó sẽ dẫn đến một số khác biệt tinh tế ở đây và đó. Tôi đã tìm thấy tích hợp tệp với EMW một chút thiếu ở những nơi khác, nhưng nó đã không bị làm phiền đủ bởi nó để gửi một bản vá.
mpdon Arena

@MPD Tôi nghĩ rằng nó sẽ - chỉ cần phát hiện ra 'kẻ phạm tội' là entity_metadata_system_entity_property_info()nơi mà một loạt các tài sản mới được xử lý $info['file']['properties']. Tôi sẵn sàng đặt cược nếu file_entity ở đó mảng đó sẽ có các thuộc tính thực thể trong đó. Tôi sẽ cố gắng viết câu trả lời sau hoặc ngày mai nếu chưa có ai thực hiện nó
Clive

1
Đã làm một bài kiểm tra nhanh và uricó ở đó với file_entity.
mpdon Arena

Câu trả lời:


9

Cảm ơn MPD rất nhiều vì đã chỉ cho tôi đi đúng hướng. Nói tóm lại, không có mô-đun Thực thể Tệp , các tệp không phải là thực thể, vì vậy chúng không có 'thuộc tính' mà tôi mong đợi.

Mô-đun Entity cung cấp một số thay mặt cho họ, nhưng URI không phải là một trong số họ. May mắn thay, nó rất đơn giản để làm cho nó có sẵn bằng cách sử dụng hook_entity_property_info_alter()và gọi lại thuộc tính tùy chỉnh:

function MYMODULE_entity_property_info_alter(&$info) {
  $info['file']['properties']['uri'] = array(
    'label' => t("URI"),
    'description' => t("The URI of the file."),
    'getter callback' => 'MYMODULE_entity_get_file_properties',
    'schema field' => 'uri',
  );
}

function MYMODULE_entity_get_file_properties($file, array $options, $name) {
  switch ($name) {
    case 'uri':
      return $file->uri;
      break;
  }
}

Sau đó, $images[0]->file->uri->value()có sẵn như mong đợi.


8

Dưới đây hoạt động mà không cần hack:

 $node_wrapper->field_media[0]->value()['uri'];

2
Thật tốt khi chỉ ra rằng điều này được hỗ trợ từ PHP 5.4 trở đi.
Ales Rebec

3

Đây là những gì làm việc cho tôi để có được đường dẫn đầy đủ của một hình ảnh ...

// wrap it
$wrapper = entity_metadata_wrapper('node', node_load(16));
// get the value
$image = $wrapper->field_image->value();
// check it
if ($image) {
   // get the full path
   $path = file_create_url($image['uri']);
}
print_r($path);

Hoặc ...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
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.