言い換えると、「listing」と呼ばれるカスタムコンテンツエンティティにあるファイルフィールドの各ファイルのURIを取得するにはどうすればよいですか。
今私は持っています:
$images = $variables['elements']['photos']['#items'];
$ imagesは FieldItemList です。
FieldItemListを反復処理して、そこで参照される各ファイルのURIを取得するにはどうすればよいですか?
Okは最初の部分を次のように考え出しました:
$images = $variables['elements']['photos']['#items'];
$photos = $images->getIterator();
foreach ($photos as $photo) {
xdebug_break();
}
今問題は:
$ photoのそれぞれのURIを取得し、それを変数として割り当てる方法...?
Berdirのコメントと私自身の調査の後、これは私が行ったものです。
if (isset($variables['elements']['photos']['0'])) {
$number_of_photos = count($variables['elements']['photos']['#items']);
$listing_pics = [];
for ($i = 0; $i < $number_of_photos; $i++) {
$pic = file_create_url($variables['elements']['photos'][$i]['#file']->getFileUri());
$listing_pics[] = $pic;
}
$variables['elements']['listing_photos'] = $listing_pics;
}
これはHook_template_preprocess_HOOK()にあり、これで、私の複数値ファイルフィールドのすべてのURLが、この{{elements.listing_photos}}のようなテンプレートで使用できるようになりました。
PHPはgetIterator()を呼び出します。その必要はありません。また、アクセスしやすい$ variables ['node']を使用します。
ファイル/画像はエンティティ参照の拡張子を参照します。つまり、それらは計算された->エンティティプロパティを継承し、参照されたエンティティを自動的にロードします。ファイルがロードできるかどうか確認してください。データに一貫性がない場合(何らかの理由でファイルが削除された場合。ファイルの可能性は低いですが、ノードやその他の参照で発生する可能性があります)は致命的なエラーになります。
foreach ($variables['node']->photos as $item) {
if ($item->entity) {
$uri = $item->entity->getFileUri();
}
}
$ uriは 'public://your_file.jpg'のようなものです。 file_create_url()を使用してパブリックURLを作成するか、それを画像スタイルエンティティのbuildUrl()メソッドに渡して、特定の画像スタイルのURLを取得することもできます。
フィールド値にアクセスする一般的な方法、各フィールドタイプにどのようなプロパティが存在するかなどについては、 http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet を参照してください。