別の方法でやります。ノードの前処理関数で:
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 %}
私はそれを実際にテストしていないので、エラーが含まれている可能性があるため、これをすべて頭から出しているので、私に警告してください: