필드를 통해 노드와 관련된 파일 객체를 얻는 것은 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']) : '';