web-dev-qa-db-ja.com

FieldItemListの項目を反復処理しますか?

言い換えると、「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}}のようなテンプレートで使用できるようになりました。

6
iain maitland

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 を参照してください。

11
Berdir