EntityMetadataWrapper 객체에서 파일 URI를 어떻게 얻습니까?


11

필드를 통해 노드와 관련된 파일 객체를 얻는 것은 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로 다시 분해 할 수는 있지만 매우 불필요하다고 생각합니다.


1
file_entity를 사용하고 있습니까?
mpdonadio

@MPD Ahhhh, 훌륭한 전화, 아니, 나는 ... 아마도 객체가 엔티티처럼 행동하지 않으면 '속성'으로 간주되는 것을 보지 않아야합니다. Entity 모듈 사용자가 선택한 URL은 URI 대신 이상한 선택 인 것 같습니다. 대답이 "당신은 구현하기 위해 필요 해요 hook_entity_property_info_alter()괜찮아요은, 바로 알고 싶다고 다음"
이브

실제로 이것이 그 차이를 만들지 확실하지 않지만 해당 모듈을 활성화하면 여기저기서 미묘한 차이가 생깁니다. 다른 곳에서는 EMW와의 파일 통합이 약간 부족하다는 것을 알았지 만 패치를 제출하기에 충분히 신경 쓰지 않았습니다.
mpdonadio

@MPD 나는 그것이 단지 '범죄자'라는 것을 알게 될 것이라고 생각한다 entity_metadata_system_entity_property_info(). 여기에서 많은 새로운 속성들이 적용된다 $info['file']['properties']. file_entity가 거기에 있으면 해당 배열에 이미 엔티티 속성이 이미있을 것입니다. 아무도 아직 답변을하지 않았다면 나중에 또는 내일 답변을 드리겠습니다.
Clive

1
빠른 테스트를 수행했으며 urifile_entity가 있습니다.
mpdonadio

답변:


9

올바른 방향으로 나를 지적 해 주신 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()예상대로 사용할 수 있습니다.


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.