EntityMetadataWrapper 객체에서 파일 URI를 어떻게 얻습니까? 사용할 수있는 속성을 보면

필드를 통해 노드와 관련된 파일 객체를 얻는 것은 EntityMetadataWrapper:

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

그래서 훌륭합니다. 그러나 표준 파일 객체의 일부 속성을 사용하려고하는데 사용할 수 없습니다. $images[0]->file위 코드 를 사용하여 사용할 수있는 속성을 보면 다음과 같습니다.

  • 버팀대
  • 이름
  • 몸짓 광대극
  • 크기
  • url
  • 타임 스탬프
  • 소유자

특히, uri누락되어 있으며 그 대신 url이미지 파일의 전체 외부 URL 인 속성이 있습니다. URI를 통해 이러한 이미지를 조작하고 싶습니다 (엄지 만들기 등).

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

EntityMetadataWrapper처음부터 를 사용하는 모든 요점을 부정하는 것 같습니다 .

내가 무엇을 놓치고 있습니까? 랩핑 된 파일 오브젝트의 URI는 어디에 있습니까? 그것이 가능하지 않다면, 모든 것의 선하고 순수한 사랑을 위해, 왜 그렇지 않습니까?!

URL을 URI로 다시 분해 할 수는 있지만 매우 불필요하다고 생각합니다.



답변

올바른 방향으로 나를 지적 해 주신 MPD에게 감사드립니다. 간단히 말해서 File 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()예상대로 사용할 수 있습니다.


답변

아래는 해킹없이 작동합니다.

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

답변

이것이 단일 이미지의 전체 경로를 얻는 데 효과적입니다 …

// 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']) : '';