小枝のインラインスタイルを使用して、画像を背景画像としてレンダリングしたい。 bg_imageというフィールドを作成して、標準のプレーンページに添付しました。
数時間いじり回した後、node.html.twigで画像URLを取得できました
{{ file_url(node.field_bg_image.0.entity.uri.value) }}
しかし、フィールド内で機能させることができませんでした--field-bg_image.html.twig
とにかくそこからノードを取得できるので、画像を取得できますか?
インラインスタイルとして使用する画像のURLを取得するにはどうすればよいですか?多分私はフィールドから変数を渡すことができると思いました--field-bg_image.html.twigをimage.html.twigに渡してから、単にレンダリングします
{{ uri }}
の代わりに
<img{{ attributes.addClass(classes) }} />
しかし、includesを使用しない限り、そこに変数を渡すことはできませんでした
{% include 'image.html.twig' with {'image': image, 'isFromField': isFromField} %}
(isFromFieldは、フィールドから来る場合はtrueです--field-bg_image.html.twig)しかし、それも機能しませんでした。画像はそのようにレンダリングされたことはありません。
あなたが助けることができれば非常にうれしいでしょう-私のphpの知識は非常に基本的です。ありがとう
変数node
は、ノードテンプレート(およびURLにノードが含まれている場合はページテンプレート)にのみプリロードされます。ここで、フィールドテンプレートのノードフィールドにアクセスする場合は、別の場所を調べる必要があります。
field.html.twig:
{{ file_url(element['#object'].field_image.0.entity.uri.value) }}
element['#object']
はフィールドテンプレートの親エンティティであり、このエンティティ(ノードの場合)から任意のフィールドにアクセスできます。
実際のフィールドから未加工の値にアクセスする場合は、フィールドtwigのロジックに従い、項目ループ内の値にフィールド項目オブジェクト#item
から直接アクセスすることをお勧めします。
{% for item in items %}
{{ file_url(item.content['#item'].entity.uri.value) }}
{% endfor %}
編集:画像スタイルのURLを取得します
モジュール Twig Tweak をインストールすると、uriを使用して画像スタイルのURLを取得できます。
{% for item in items %}
{{ item.content['#item'].entity.uri.value | image_style('thumbnail') }}
{% endfor %}
新しいカスタムブロックの1つで同じことをしたい場合、これは機能します。
{{ file_url(content.field_image['#items'].entity.uri.value) }}
このコードを.themeファイルで使用します。
function THEMENAME_preprocess_node(&$variables) {
if ($variables['node']->field_image->entity) {
$variables['image_url'] = $url = entity_load('image_style', 'medium')->buildUrl($variables['node']->field_image->entity->getFileUri());
}
}
それは改善される可能性があります。私は画像フィールドをチェックし、そのURLに画像スタイルをロードしています。
それから私のnode--page.html.twigファイルに私はこれを持っています:
{% if image_url is not empty %}
<div class="featured-thumb">
<img src="{{ image_url }}"/>
</div>
{% endif %}
<div>{{ content.body|without('field_image') }}</div>
繰り返しますが、それはいくつかの改善を使用できます。ありがとう
別の方法でやります。ノードの前処理関数で:
use Drupal\image\Entity\ImageStyle; // Don't forget this use.
function THEMENAME_preprocess_node__NODETYPE(&$variables){
$node = $variables['node'];
if(isset($node->get('field_image')->entity)){
$image_style = 'large'; // Or whatever your image style's machine name is.
$style = ImageStyle::load($style);
$variables['image'] = $style->buildUrl($node->get('field_image')->entity->getFileUri()); // Generates file url.
}
}
次に、テンプレート(node--NODETYPE.html.twig)で、画像をそのままレンダリングします。
{% if image %}
<img src="{{ image }}" />
{% endif %}
ただし、大量の画像をレンダリングする必要がある場合は、各画像でループする前に配列にスタイルをロードすることをお勧めします。 300以上の画像をロードする必要があったためにロード時間の深刻な問題に遭遇したため、以前にすべてをロードするのではなく、個別にスタイルをロードしていました。上記と同じベースの例を以下に示します。
use Drupal\image\Entity\ImageStyle; // Don't forget this use.
function THEMENAME_preprocess_node__NODETYPE(&$variables){
$node = $variables['node'];
if(isset(node->get('field_images')[0]->entity)){ // Notice how, this time, I check if the FIRST image is set (if it's true, then u'll allow the loop for at least 1 element)
$images_styles = [
'large' => ImageStyle::load('large'),
'thumbnail' => ImageStyle::load('thumbnail')
];
$count = 0;
foreach($node->get('field_images') as $image){
$variables['images'][$count]['large'] = $images_styles['large']->buildUrl($image->getFileUri());
$variables['images'][$count]['thumbnail'] = $images_styles['thumbnail']->buildUrl($image->getFileUri());
$count++;
}
}
}
次に、テンプレート(node--NODETYPE.html.twig)で、画像をそのままレンダリングします。
{% if images %}
<ul>
{% for image in images %}
<li>
<img src="{{ image.large }}" /> // Large image url.
<img src="{{ image.thumbnail }}" /> // Thumbnail image url.
</li>
{% endfor %}
</ul>
{% endif %}
私は実際にはテストしていません。エラーが含まれている可能性があるので、これらすべてを頭から出しているので、お気軽に警告してください:-)。
2日を過ごした後、私は私の同様のコードに対するいくつかの答えを見つけました。一部のフィールドを含めたり除外したりします。
{%
set classes = [
'block',
'block-' ~ configuration.provider|clean_class,
'block-' ~ plugin_id|clean_class,
'cover-image',
]
%}
{% set background_image = file_url(content.field_banner_image['#items'].entity.uri.value) %}
<div{{ attributes.addClass(classes) }} style="background-image:
url({{background_image}})">
<div class="block-inner">
{{ title_prefix }}
{% if label %}
<h2{{ title_attributes }}>{{ label }}</h2>
{% endif %}
{{ title_suffix }}
{% block content %}
{{ content.field_media_image }}
<div class="summary">
{{ content|without('field_banner_image') }}
</div>
{% endblock %}
</div>
</div>
テーマブロックの細かい名前--bundle--banner-block.html.twigこのコードは、画像付きのカスタムブロック用です。
単純なファイルの別の例。コード全体をペストするのではなく、不可欠なものだけです。
<a href="{{file_url(node.field_attachment1.entity.uri.value) }}" ><h3>
{{content.field_short_information}} </h3></a>
ノードnode--all_notice.html.twigのこのコードスニペット。 drupal 8.8.3で現在動作しているすべてのもの