小枝テンプレート内から画像スタイルのURLを見つける方法は?


10

画像を2回使用するノードテンプレートを実装しています。1つは「通常の」方法で(つまり、そのビューモードのフィールドの表示構成で定義された画像スタイルを使用して)、もう1つはcss background-imageプロパティとしてです。

次の2つのいずれかが必要です。

  1. (理想的には)同じ画像の異なる画像スタイルのURLを取得する方法。

  2. 画像フィールドのURLを取得する方法。

私は使用dump()kint()て、答えに自分自身を助けるのに苦労しています。どちらも出力が多すぎ(「親」への埋め込みリンクなどのおかげで)、必要な情報がないようです。たとえば、dump(content.field_image)出力を見ると、画像の実際のURLはありません(そのため、{{ content.field_image }}?!kint()一方、引数を渡すと完全に死に、トップレベルのバージョンは大きすぎてナビゲートできません。phptemplate + xdebugを使用すると、デバッグが非常に簡単になりました。(はい、私はthemersがデータベースを削除できないのは良いことだと知っています。)

意味(1)への答えがありますあなたはそれを行うことはできませんが、私は(2)内の既存のURLを得ることができない理由を私は理解していませんか?

回答:


11

画像スタイルのURLをプリプロセス関数で取得して、ノードテンプレートに渡すことができます。(私の場合、私はページレベルで必要でした、これはまだノードで機能すると思います)

"myimagefield"がイメージフィールドのマシン名で、 "myimagestyle"がスタイルのマシン名であるこのようなものも、Entity \ ImageStyleが含まれていることを確認してください。

use Drupal\image\Entity\ImageStyle;

/**
 * Implements hook_preprocess_page().
*/
function mytheme_preprocess_page(&$variables, $hook) {
  if ($variables['node']) {
    $node = $variables['node'];
    if($node->myimagefield[0]){
        $cover_image = $node->myimagefield[0]->entity->getFileUri();
        $image_url = ImageStyle::load('myimagestyle')->buildUrl($cover_image);
        $variables['my_image'] = $image_url;
    }
  }
}

1
質問は、フィールドの表示構成からビューモードをプルすることです。$ image_url = ImageStyle :: load( 'myimagestyle')-> buildUrl($ cover_image);を実行して フィールドの構成から画像スタイルをどのように引き出しますか?myimagestyleを追加しただけですが、同じフィールドが複数のエンティティ(ノードなど)にあり、異なる画像スタイルが必要な場合はどうでしょうか。
usernameabc

14

最初の部分は、リンクされた質問で既に回答されています。ここには、これを行う方法のコードがあります。質問の2番目の部分に答えるには、ノードオブジェクトの元の画像にアクセスできます。

{{ file_url(node.field_image.entity.uri.value) }}

についての注意content

ノードテンプレートでは、の画像フィールドをcontentレンダリングする準備ができていません。フィールドには、表示方法の構成と、すべての生データを含むフィールドオブジェクトが含まれます。後で、これはフィールド、イメージフォーマッタ、およびイメージテンプレートにまとめられます。これが、content現時点で探しているURLが見つからない理由です。

ノードテンプレートでは、コンテンツ配列のトップレベルのフィールドを使用できます。たとえば、画像フィールドを表示できます。

{{ content.field_image }}

表示モードで設定したとおり。

編集:

モジュールTwig Tweakに新しいフィルターがあります。これで、元の画像のURIまたはURLから直接twigで画像スタイルのURLを生成できます。

{{ node.field_image.entity.uri.value | image_style('thumbnail') }} 

ありがとう。だから、すべての前処理フックは、twig呼び出しがレンダリングされるときに呼び出されます{{ content.field_image }}。また、私はあなたの提案から取得するURLは元のURLだと思います-Qのパート2は、表示モードで構成するように、画像スタイルのURLを求めていました。それは可能ですか?
artfulrobot 2016年

これは通常のアップロード画像でのみ機能し、エンティティ参照画像では機能しません。これをエンティティ参照画像で機能させるにはどうすればよいですか?
paulcap1 2017

@ paulcap1、画像フィールドは(ファイルエンティティへの)参照フィールドであるため、正確には何を意味しているのかわかりません。参照エンティティの内部に画像がある場合は、.entity2回必要です。1 回目はエンティティに到達し、2回目は画像に到達します。
4k4

1
@ paulcap1、例えば{{ node.field_ref.entity.field_image.entity.uri.value }}
4k4

@ 4k4。デフォルトのページコンテンツタイプを使用しています。field_global_imageというエンティティ参照フィールドがあります。これはImage Bundleを使用します。Bundles画像フィールドは「画像」と呼ばれています。{{node.field_global_image.entity.image.entity.uri.value}}を使用して自分の方法で試しました。また、{{node.image.entity.field_global_imageのようにフィールドを切り替えてみました.entity.uri.value}}どちらも機能しませんでした。別の投稿での私の回答では、それが私にとって効果的でした
paulcap1

6

Twig Tweakモジュールをインストールし ますhttps://www.drupal.org/project/twig_tweak

そしてこのモジュールTwig Field https://www.drupal.org/project/twig_field_value

通常の画像アップロードフィールド画像を使用している場合は、ノードテンプレートでこれを使用します。

<img src="{{ node.field_regular_image.entity.uri.value | image_style('thumbnail') }} " >

エンティティ参照画像を使用している場合は、これを使用します。

<img src="{{ file_url(content.field_global_image|field_target_entity.image.entity.uri.value | image_style('thumbnail'))}} " >

参照エンティティの使用についての例にように注意imageした後、field_target_entity参照エンティティに画像フィールドを指します。調整する必要があるかもしれません。
ダニエルズ

1
ありがとう!:エンティティの参考例はまたによってtwig_field_valueモジュールなしに達成することができるfile_url(node.field_image.entity.field_referenced_image.entity.uri.value | image_style('thumbnail'))
ジョン・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.