ฉันจะรับไฟล์ URI จากวัตถุ EntityMetadataWrapper ได้อย่างไร


11

การเก็บอ็อบเจ็กต์ไฟล์ที่เกี่ยวข้องกับโหนดผ่านฟิลด์เป็นเรื่องง่ายโดยใช้EntityMetadataWrapper:

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

นั่นเยี่ยมมาก อย่างไรก็ตามฉันต้องการใช้คุณสมบัติบางอย่างของวัตถุไฟล์มาตรฐานและไม่สามารถใช้งานได้ เมื่อฉันดูคุณสมบัติที่มีอยู่ในการ$images[0]->fileใช้รหัสข้างต้นฉันเห็นเหล่านี้:

  • fid
  • ชื่อ
  • ละครใบ้
  • ขนาด
  • URL
  • การประทับเวลา
  • เจ้าของ

ที่สะดุดตาที่สุดuriหายไปและในสถานที่มีurlคุณสมบัติซึ่งเป็น URL ภายนอกแบบเต็มไปยังไฟล์ภาพ ฉันต้องการจัดการภาพเหล่านี้ผ่านทาง URI ของพวกเขา (สร้างนิ้วโป้ง ฯลฯ ) ดังนั้นฉันจึงไม่ทำเช่นนี้

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

ซึ่งดูเหมือนจะลบล้างจุดทั้งหมดของการใช้EntityMetadataWrapperในสถานที่แรก

ฉันกำลังคิดถึงอะไร URI อยู่ที่ไหนในวัตถุไฟล์ที่ถูกหุ้มไว้? หากยังไม่พร้อมสำหรับความรักของทุกสิ่งที่ดีและบริสุทธิ์ทำไมไม่!

ฉันรู้ว่าฉันสามารถแยกแยะ URL กลับเป็น URI ได้ แต่นั่นก็ไม่จำเป็นเช่นกัน


1
คุณใช้ file_entity หรือไม่
mpdonadio

@MPD Ahhhh โทรเยี่ยมมากไม่ฉันไม่ใช่ ... บางทีฉันไม่ควรคาดหวังว่าจะเห็นสิ่งที่ฉันพิจารณา 'คุณสมบัติ' ถ้าวัตถุไม่ทำหน้าที่เหมือนนิติบุคคล URL ดูเหมือนจะเป็นตัวเลือกที่แปลกแทน URI เพื่อให้โมดูลเอ็นติตี้สามารถเลือกได้ หากคำตอบคือ "คุณจะต้องใช้งานhook_entity_property_info_alter()" ก็ไม่เป็นไรแค่อยากรู้
ไคลฟ์

จริง ๆ แล้วฉันไม่แน่ใจว่าจะสร้างความแตกต่างได้หรือไม่ แต่การเปิดใช้งานโมดูลนั้นจะทำให้เกิดความแตกต่างเล็กน้อยที่นี่และที่นั่น ฉันพบว่าการรวมไฟล์กับ EMW ขาดหายไปในที่อื่น แต่ไม่ได้รับความสนใจเพียงพอที่จะส่งแพตช์
mpdonadio

@MPD ฉันคิดว่ามันจะ - พบเพียงแค่ออก 'ผู้กระทำผิด' เป็นที่พวงของคุณสมบัติใหม่ได้รับการติดอยู่บนentity_metadata_system_entity_property_info() $info['file']['properties']ฉันยินดีที่จะเดิมพันหาก file_entity อยู่ในนั้นอาร์เรย์นั้นจะมีคุณสมบัติเอนทิตีในตัวเองอยู่แล้ว ฉันจะพยายามเขียนคำตอบในภายหลังหรือพรุ่งนี้ถ้าไม่มีใครทำไปแล้ว
ไคลฟ์

1
ทำการทดสอบอย่างรวดเร็วและuriอยู่ที่นั่นด้วย file_entity
mpdonadio

คำตอบ:


9

ขอบคุณ MPD มากสำหรับการชี้ฉันในทิศทางที่ถูกต้อง กล่าวโดยย่อคือหากไม่มีโมดูลไฟล์เอนทิตีไฟล์ไม่ใช่เอนทิตีดังนั้นพวกเขาจึงไม่มี 'คุณสมบัติ' ที่ฉันคาดหวัง

โมดูล Entity จัดเตรียมบางอย่างในนามของพวกเขา แต่ URI ไม่ใช่หนึ่งในนั้น โชคดีที่มันง่ายมากที่จะทำให้มันพร้อมใช้งานhook_entity_property_info_alter()และการเรียกกลับคุณสมบัติที่กำหนดเอง:

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;
  }
}

หลังจากนั้น$images[0]->file->uri->value()สามารถใช้ได้ตามที่คาดไว้


8

ด้านล่างใช้งานได้โดยไม่ต้องแฮ็ค:

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

2
เป็นการดีที่จะชี้ให้เห็นว่าสิ่งนี้ได้รับการสนับสนุนจาก PHP 5.4 ใน
Ales Rebec

3

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉันที่จะได้เส้นทางที่เต็มไปด้วยภาพเดียว ...

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

หรืออีกทางหนึ่ง ...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.