EntityMetadataWrapperオブジェクトからファイルURIを取得するにはどうすればよいですか?


11

フィールドを介してノードに関連するファイルオブジェクトを取得するのは、EntityMetadataWrapper

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

それは素晴らしいことです。ただし、標準のファイルオブジェクトの一部のプロパティを使用したいのですが、それらは使用できません。$images[0]->file上記のコードを使用して利用できるプロパティを見ると、次のことがわかります。

  • fid
  • 名前
  • MIME
  • サイズ
  • 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あぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ!Entityモジュールの人たちが選択した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

回答:


9

MPDを正しい方向に向けてくれてありがとう。つまり、ファイルエンティティモジュールがないと、ファイルはエンティティではないため、当然期待していた「プロパティ」がありません。

Entityモジュールは代わりにいくつかを提供しますが、URIはそれらの1つではありません。幸い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 2016年

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.