Я использую Drupal 8 с потрясающим встроенным модулем отзывчивых изображений. Я хочу внести изменения в поле img (резервное изображение) до <picture>
элемент отображается более конкретно: мне нужно добавить width
а также height
параметры к <img>
поле. Поэтому я использую preprocess_image
крюк.
Этот хук предоставляет мне кучу переменных, в первую очередь $variables[attributes]
,
$variables[width]
, $variables[height]
а также $variables[uri]
все пустые строки по какой-то причине. к счастью $variables[attributes]
содержит:
$variables[attributes][data-entity-uuid]
а также $variables[attributes][srcset]
так что по крайней мере у меня есть путь к стилизованному изображению и uuid к исходному изображению.
Я подумал, что есть два способа попасть туда, куда я хочу (это загрузить стилизованное изображение и получить высоту и ширину):
Я не могу заставить вариант 1 работать. Путь в srcset выглядит так:
/sites/default/files/styles/image_lightbox/public/inline-images/erf-2.jpg?itok=4_EU9Ttx
и я думаю, что мне нужно преобразовать это в public://styles/image_lightbox/public/inline-images/erf-2.jpg
но застрял в чем-то вроде:
$parsed_url = parse_url($variables['attributes']['srcset']);
$path = file_build_uri($parsed_url['path']);
но это все равно оставило там часть / sites / default / files
Я не могу заставить вариант 2 работать. Я застрял на:
$file_array = \Drupal::entityTypeManager()->getStorage('file')->loadByProperties(['uuid' => $img_uuid]);
$file_id = reset(array_keys($file_array));
$file = File::load($file_id);
$image_uri = ImageStyle::load('image-lightbox')->buildUrl($file->getFileUri());
$image = \Drupal::service('image.factory')->get($image_uri);
Это не в $file = File::load($file_id)
по какой-то причине
Потратив 8 часов своей жизни на решение этой проблемы, я был бы очень благодарен за любую помощь
Ответ был намного проще, чем я думал.
Вариант 1 оказался очень простым:
Вместо преобразования /sites/default/files/styles/image_lightbox/public/inline-images/erf-2.jpg?itok=4_EU9Ttx
(от $variables[attributes][srcset]
) чтобы public://styles/image_lightbox/public/inline-images/erf-2.jpg
, Я должен был преобразовать это в http://hostname/path-to-drupal-install/sites/default/files/styles/image_lightbox/public/inline-images/erf-2.jpg?itok=4_EU9Ttx
что я и сделал так:
global $base_url;
$image_uri = $base_url.$variables['attributes']['srcset'];
Других решений пока нет …