在Drupal 8的预处理功能中获取图像样式高度
get image style height in pre process function in Drupal 8
我将 Drupal 8 与出色的内联响应图像模块一起使用。我想在呈现 <picture>
元素之前更改 img 字段(后备图像),更具体地说:我需要将 width
和 height
参数添加到 <img>
字段。因此,我使用 preprocess_image
钩子。
这个钩子为我提供了一堆变量,最显着的是 $variables[attributes]
。
由于某些原因,$variables[width]
、$variables[height]
和 $variables[uri]
都是空字符串。幸运的是 $variables[attributes]
包含:
$variables[attributes][data-entity-uuid]
和 $variables[attributes][srcset]
所以至少我有样式图像的路径和原始图像的 uuid。
我想有两种方法可以到达我想去的地方(即加载样式图像并获取高度和宽度):
- 将路径转换为 uri(或者它是路径)?
- 从 uuid 中获取文件 ID,然后以某种方式从样式化图像中获取 uri(这似乎绕了我想要的东西)
我无法使用选项 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'];
我将 Drupal 8 与出色的内联响应图像模块一起使用。我想在呈现 <picture>
元素之前更改 img 字段(后备图像),更具体地说:我需要将 width
和 height
参数添加到 <img>
字段。因此,我使用 preprocess_image
钩子。
这个钩子为我提供了一堆变量,最显着的是 $variables[attributes]
。
由于某些原因,$variables[width]
、$variables[height]
和 $variables[uri]
都是空字符串。幸运的是 $variables[attributes]
包含:
$variables[attributes][data-entity-uuid]
和 $variables[attributes][srcset]
所以至少我有样式图像的路径和原始图像的 uuid。
我想有两种方法可以到达我想去的地方(即加载样式图像并获取高度和宽度):
- 将路径转换为 uri(或者它是路径)?
- 从 uuid 中获取文件 ID,然后以某种方式从样式化图像中获取 uri(这似乎绕了我想要的东西)
我无法使用选项 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'];