Изображения Drupal 8 со стилем изображения

В drupal 7 я использую функцию image_style_url('style', uri) для создания нового изображения со стилем и возврата пути к изображению. так что же будет вместо него в друпале 8? Спасибо


person user3810914    schedule 15.07.2014    source источник


Ответы (7)


Согласно записям об изменениях:

use Drupal\image\Entity\ImageStyle;

$path = 'public://images/image.jpg';
$url = ImageStyle::load('style_name')->buildUrl($path);
person Clive    schedule 15.07.2014
comment
Мне нужно сделать это внутри шаблона Twig, но здесь я не могу использовать PHP. Как я могу сделать? - person Fred K; 22.04.2016
comment
@FredK Вы смотрите на это неправильно: вам необходимо делать это в шаблоне; вы можете захотеть по какой-то причине, но это плохая идея, и вам определенно не нужно это делать. Функция предварительной обработки шаблона — правильное место для этого кода. Но если вы непреклонны в том, что это должно быть сделано в Twig, вам нужно будет написать немного PHP, чтобы предоставить ему методы класса ImageStyle. Однако это займет больше времени, чем просто рекомендуемый способ. - person Clive; 22.04.2016
comment
Для тех, кто все еще ищет решение @FredK, модуль Twig Tweak имеет фильтр image_style, который можно использовать, чтобы избежать предварительной обработки - person Clive; 01.03.2019

Вы должны попытаться использовать новые функции Drupal везде, где это возможно.

Вместо этого используйте:

use Drupal\file\Entity\File;
use Drupal\image\Entity\ImageStyle;

$fid = 123;
$file = File::load($fid);
$image_uri = ImageStyle::load('your_style-name')->buildUrl($file->getFileUri());

Отредактировано согласно https://www.drupal.org/node/2050669:

$original_image = 'public://images/image.jpg';

// Load the image style configuration entity
use Drupal\image\Entity\ImageStyle;
$style = ImageStyle::load('thumbnail');

$uri = $style->buildUri($original_image);
$url = $style->buildUrl($original_image);
person sagesolutions    schedule 01.12.2015

В ваших контроллерах и другой ООП-части Drupal вы можете использовать:

use Drupal\image\Entity\ImageStyle;

$path = 'public://images/image.jpg';
$url = ImageStyle::load('style_name')->buildUrl($path);

А в YOUR_THEME.theme файле пока Error: Class 'ImageStyle' not found in YOURTHEMENAME_preprocess_node можно сделать так

 $path = 'public://images/image.jpg';
 $style = \Drupal::entityTypeManager()->getStorage('image_style')->load('thumbnail');
 $url = $style->buildUrl($path);

Другой метод - предоставить массив для рендеринга и позволить движку рендеринга drupal отобразить его.

$render = [
    '#theme' => 'image_style',
    '#style_name' => 'thumbnail',
    '#uri' => $path,
    // optional parameters
];
person Yuseferi    schedule 11.02.2018
comment
Спасибо за 3 версии! - person Patrick Janser; 07.05.2018

Я обнаружил, что мне часто нужно предварительно обработать изображение, чтобы применить стиль изображения к изображению на узле или типе абзаца. Во многих случаях я создал абзац, который позволяет пользователю выбирать ширину изображения в процентах. В предварительной обработке я бы проверил значение ширины и применил правильный стиль изображения.

use Drupal\image\Entity\ImageStyle;

function THEME_preprocess_paragraph__basic_content(&$vars) {
  //get the paragraph
  $paragraph = $vars['paragraph'];

  //get the image
  $images = $paragraph->get('field_para_image');
  //get the images value, in my case I only have one required image, but if you have unlimited image, you could loop thru $images
  $uri = $images[0]->entity->uri->value;

  //This is my field that determines the width the user wants for the image and is used to determine the image style
  $preset = $paragraph->get('field_column_width')->value;

  $properties = array();
  $properties['title'] = $images[0]->getValue()['title'];
  $properties['alt'] = $images[0]->getValue()['alt'];

  //this is where the Image style is applied
  switch($preset) {
     case 'image-20':
       $properties['uri'] = ImageStyle::load('width_20_percent')->buildUrl($uri);
       break;
     case 'image-45':
       $properties['uri'] = ImageStyle::load('width_45_percent')->buildUrl($uri);
       break;
     case 'image-55':
       $properties['uri'] = ImageStyle::load('width_55_percent')->buildUrl($uri);
       break;
     case 'image-100':
       $properties['uri'] = ImageStyle::load('width_100_percent')->buildUrl($uri);
       break;
  }
  //assign to a variable that the twig template can use
  $vars['basic_image_display'] = $properties;
}

В этом примере я предварительно обрабатываю определенный тип абзаца с именем «basic_content», но вы можете сделать то же самое с предварительной обработкой узла. Продолжая мой пример, у меня будет шаблон ветки с именем paragraph--basic_content.html.twig для обработки отображения этого типа абзаца.

Отображение изображения будет примерно таким в файле twig.

<img class="img-responsive" src="{{basic_image_display['uri']}}" alt="{{ basic_image_display['alt'] }}" title="{{ basic_image_display['title'] }}"/>
person Brian Williams    schedule 14.07.2017

У меня работает из классической базы данных Drupal Query в файле .module:

$query = \Drupal::database()->select('file_managed', 'f' );
$query->addField('f', 'uri');
$pictures = $query->execute()->fetchAll();

foreach ($pictures as $key => $picture) {

   $largePictureUri = entity_load('image_style', 'large')->buildUrl($picture->uri);
}
person pierre delaunay    schedule 07.02.2017

$view_mode = $variables['content']['field_media_image']['0']['#view_mode'];
$display_content = \Drupal::service('entity_display.repository')
->getViewDisplay('media', 'image', $view_mode)->build($media_entity);
$style = ImageStyle::load($display_content['image'][0]['#image_style']); $original_image = $media_entity->get('image')->entity->getFileUri();
$destination = $style->buildUri($original_image);

Вот как вы получаете стиль изображения из объекта медиа-изображения.

person muri    schedule 17.04.2021

Я использовал этот код в Drupal 8. Это работает нормально.

$fid = 374; //get your file id, this value just for example 
$fname = db_select('file_managed', 'f')->fields('f', array('filename'))->condition('f.fid', $fid)->execute()->fetchField();
$url = entity_load('image_style', 'YOUR_STYLE_NAME')->buildUrl($fname);
person Undrrey    schedule 05.10.2014
comment
Лучшей практикой (и более чистым кодом) является использование объектов Drupal вместо запросов к базе данных. Я бы рекомендовал команду $file = File::load($fid); для получения объекта File вместо запроса имени файла к базе данных. - person sagesolutions; 27.07.2016
comment
Чтобы добавить к комментарию sagesolution, функция entity_load() теперь устарела, поэтому пользователям следует обращаться к ответам, которые загружают стиль с помощью класса ImageStyle. - person Sean Wickham; 26.01.2017