ノードのfield_imageから画像URLを取得する


42

だから私はこのノードを持っています:

object(Drupal\node\Entity\Node)[1862]
  protected 'values' => 
    array (size=17)
      'vid' => 
        array (size=1)
          'x-default' => string '7' (length=1)
      'langcode' => 
        array (size=1)
          'x-default' => 
            array (size=1)
              0 => 
                array (size=1)
                  'value' => string 'en' (length=2)
      ... (more fields)
      'field_image' => 
        array (size=1)
          'x-default' => 
            array (size=1)
              0 => 
                array (size=5)
                  'target_id' => string '1' (length=1)
                  'alt' => string '' (length=0)
                  'title' => string '' (length=0)
                  'width' => string '150' (length=3)
                  'height' => string '120' (length=3)

これで、field_imageにはx-defaultといくつかの基本的な画像データを含む配列があります。画像を表示する、またはTwigテンプレート内に画像へのリンクを作成するにはどうすればよいですか?


チェックする時間はありませんが、おそらくurl(node.field_image.0.entity.uri)関連する問題)と同じくらい簡単です
クライヴ

@Clive私はこれを試して、このエラーを出しました:Recoverable fatal error: Object of class Drupal\Core\Field\FieldItemList could not be converted to string だから私はこれで試してみました: url(node.field_image.0.entity.uri.value)しかし、それは私にこれを教えてくれます:Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Route "public://image.png" does not exist.")
Rias 14年

エラー... FieldItemListsを文字列表現に変換するTwigヘルパー関数がない場合は、プリプロセスフックで行う必要があると思います(見つけられません)
Clive

なるほど、url()ルートが欲しい。どうurl_from_path(node.field_image.0.entity.uri.value)
クライブ

うーんはurl_from_path()これを生成するようだ:http://mywebsite.local/public%3A//image.pngそれはURLエンコードしてURLに正確な値を追加しているように見えるので
リアス

回答:


49

8.0.x以降のこの回答の更新バージョンを以下に示します。@joelpittetコメントに基づいています。

{{ file_url(node.field_image.entity.fileuri) }}

2
画像スタイル固有のURL(サムネイルなど)ではなく、「スタイルなし」の元の画像のURLを取得することに注意してください。VladimirMの答えは別として、小枝で正しいスタイルの画像URLを取得する方法はありません。...現在、少なくとも
フィリップ・マイケル・

2
...イメージスタイルがTwig Tweakで利用可能になりました-drupal.org/project/twig_tweak
4k4

1
Fileクラスには、持っているurl()あなたは、単に呼び出すことができますので、この方法をentity.url()渡すのではなく、entity.fileurifile_url()
Kiee

36

Twigについては知りませんが$node->field_image->entity->getFileUri()、PHPでファイルURIを取得します。これを呼び出す必要がありますfile_create_url()

file_create_url($node->field_image->entity->getFileUri())

それが小枝で可能かどうかはわかりません。それが不可能な場合は、いつでも前処理で計算し、新しい変数として追加できます。


2
file_create_url()をコアにしようとしていますが、関心がないために問題が古くなっています。 drupal.org/node/2168231それにそのGOTがなければならない場合は、{{file_url(node.field_image.entity.fileuri)}}けれども
joelpittet

26

誰かがスタイル付きの画像を必要とした場合:

$styled_image_url = ImageStyle::load('large')->buildUrl($node->field_image->entity->getFileUri());

4
これは素晴らしい答えです。あなたの中にいることを注意.themeまたは.moduleファイルあなたが先頭にこれを追加することをお勧めします:use Drupal\image\Entity\ImageStyle;
mikeDOTexe

2
私は代わりにIPを使用するため、Safariが画像を表示しないというhttpsの問題に遭遇しました。$relative = file_url_transform_relative($styled_image_url);相対的であることを確認するために追加することができます。ここにAPI
mikeDOTexe

9

上記の小枝ソリューションはどれも私にとってはうまくいきませんでした

{{ file_url(node.field_image['#items'].entity.uri.value) }}

注:Drupal 8.5以降で動作するはずです


この種のものがしばらくして廃止されるのは悪いことだと思います。Drupalをアップグレードしても機能し続けるはずです!これはDrupal 8.6で動作します、ありがとう。
Stef Van Looveren

7

だから私はCliveの助けを借りて答えを見つけました。

Twigで画像URIを取得するには node.field_image.0.entity.uri.value

画像の完全なURLを取得するには、次を使用します。 file_create_url(node.field_image.0.entity.uri.value)

Twigでこれを行うことはまだ不可能ですが、彼らはそれに取り組んでいます-> こちらをご覧ください


6

D8で私のために働いたのは次のとおりです:

$imageUrl = $node->get('field_image')->entity->uri->value;

kint($node->get('field_image')->entity)配列の使用と参照は非常に役に立ちました

ここに画像の説明を入力してください

次に、私が使用した小枝ファイルで:

<img class="top-article-image" src="{{ file_url(imageUrl) }}" />

画像が挿入されておらず、デフォルト値が設定されている場合はどうなりますか。
AMOL


2

私は常にヘルパー関数を使用しています

  /**
   * Get the Image URI.
   *
   * @param \Drupal\Core\Entity\Entity $entity
   * @param $fieldName
   * @param bool $imageStyle
   * @return mixed
   */
  public function getImageUri(\Drupal\Core\Entity\Entity $entity, $fieldName, $imageStyle = FALSE) {
    $imageField = $entity->get($fieldName)->getValue();
    if (!empty($imageField[0]['target_id'])) {
      $file = File::load($imageField[0]['target_id']);
      if ($imageStyle) {
        return ImageStyle::load($imageStyle)->buildUrl($file->getFileUri());
      }

      // Original URI.
      return file_create_url($file->getFileUri());
    }
  }

1

これは、小枝テンプレートの画像フィールドの画像スタイルに関連付けられた画像URLを取得する場合の方法です。

最初にTwig Tweakモジュールをインストールします

次に、画像URIを変数として設定します。URIを使用すると、小枝の調整パターンを使用して、任意の画像スタイルのパスを取得できます。下記参照:

{% set image_uri = content.field_feature_row_image['#items'].entity.uri.value %}

<img src="{{ image_uri|image_style('image1200x1103') }}"/>

Twig Tweak v2.4 +はfile_url、エンティティからファイルURLを抽出するフィルターを提供します。

<img src="{{ node.field_image|file_url|image_style('image1200x1103') }}"/>

0

私は同じ問題を抱えていたので、get_image_path()Twig関数を作成し、ボイラープレートスターターモジュールに他の便利な機能を追加しました。

https://github.com/brynj-digital/starter

この関数は、画像フィールドと画像スタイルのマシン名を受け入れ、その画像パスを返します。

これは、コンテキストのロットで働く-あなたは渡すことができnode.field_namecontent.field_nameまたはrow._entity.field_name(ビューのフィールドテンプレートの場合)。


0

ええと、実際に私の年齢は、結果のURLが機能しなかった理由を見つけるのにかかりました。すべて404'ed。まだ存在しない場合は、最初に派生物を作成する必要があります

たとえば、後で元の画像がアップロードされた後に画像スタイルを追加する場合、スタイル付き画像ファイルはまだありません(画像派生物)。最初に作成する必要があります。

必要に応じて交換field_MYIMAGEMYSTYLEてください。

$original_image = $node->field_MYIMAGE->entity->getFileUri();
$style = \Drupal::entityTypeManager()->getStorage('image_style')->load('MYSTYLE');

$destination = $style->buildUri($original_image);
if (!file_exists($destination)) {
  $style->createDerivative($original_image, $destination);
}

$url = $style->buildUrl($original_image);

これが自動的に行われることを望みます。


0

やや関連して、ここに私が使用したものがあります(私をそこに連れて行ってくれたすべての回答のおかげで)小枝のメディアエンティティの画像フィールドから画像ファイルのURLを取得します:

{% set media_img_url = file_url(content.field_media_image.0['#item'].entity.uri.value) %}

今、私は私の小枝テンプレートでこの変数を使用できます

{{ media_img_url }}

0

URI、alt、titleなどの画像属性を取得するには、以下のようなテンプレートを使用してください。

ノード小枝テンプレート

{{node.field_name.entity.fileuri}}

フィールド小枝テンプレート

{{content.field_name.entity.fileuri}}

他のフィールドの小枝テンプレート

{{element['#object'].field_name.entity.fileuri}}

注:また、twig関連の問題に関連する詳細については、twig_tweaksモジュールのチートシートを確認してください。


0

url()Fileクラスにあるメソッドをショートカットとして使用できます。

{{ file_url(node.field_image.entity.fileuri) }}

以下に短縮できます。

{{ node.field_image.entity.url }}

これは前処理関数で機能しますがTwig_Sandbox_SecurityError、小枝テンプレートで呼び出されるとトリガーされます。

このStackoverflowの投稿で述べたTwig_Sandbox_SecurityErrorようurlに、settings.phpファイルで許可するようにtwigに伝えることができます。

File :: Url()https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3Aurl/8.6.xのドキュメントを参照してください


-4

あなたは2つの方法でそれを行うことができます!

1)file_create_url(---------)//内部にノードのパスを書き込む

2)file_url(-------)//内部にノードのパスを書き込む

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.