如何从EntityMetadataWrapper对象获取文件URI?


11

使用一个字段可以很容易地通过字段掌握与节点相关的文件对象EntityMetadataWrapper

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

太好了。但是,我想使用标准文件对象的某些属性,但它们不可用。当我查看$images[0]->file使用以上代码时可用的属性时,会看到以下内容:

  • 菲德
  • 名称
  • 哑剧
  • 尺寸
  • 网址
  • 时间戳记
  • 所有者

最值得一提的是,uri缺少该url属性,而在该属性中有一个属性,即图像文件的完整外部URL。我想通过它们的URI(创建缩略图等)来操纵这些图像,所以我就这样做了:

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

首先,这似乎否定了使用a的全部要点EntityMetadataWrapper

我想念什么?包装文件对象上的URI在哪里?如果没有它,为了热爱所有美好而纯洁的事物,为什么不呢?

我知道我可以将URL解构回URI,但这感觉非常不必要。


1
您正在使用file_entity吗?
mpdonadio

@MPD Ahhhh,好消息,不,我不是...如果对象不像实体那样,我不应该期待看到我认为的“属性”。但是,对于实体模块专家来说,URL似乎是一个奇怪的选择,而不是URI。如果答案是“您将需要实施hook_entity_property_info_alter()”,那很好,只是想知道
克莱夫(Clive)

我实际上不确定是否会有所作为,但是启用该模块的确会在某些地方产生细微的差别。我发现在其他地方缺少与EMW的文件集成,但是还没有为提交补丁程序感到烦恼。
mpdonadio

我认为@MPD会-刚发现“罪犯”的地方entity_metadata_system_entity_property_info(),那就是一堆新属性$info['file']['properties']。我愿意打赌,如果file_entity在那儿,该数组本身就已经有实体属性了。如果没有人做,我将在稍后或明天尝试写下答案
Clive

1
做了一个快速测试,uri并与file_entity在那里。
mpdonadio

Answers:


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

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']) : '';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.