位于模块目录中的图像的主题图像样式


10

可能是从Drupal 6的过多角度来看的,但是...

当图像位于模块文件夹中时,如何给定图像样式的图像主题?这让我发疯,我知道我只是缺少一些简单的东西。

这是一些示例代码,显示了我要执行的操作:

$file_uri = 'public://sites/all/modules/my_module/logo.jpg';
$data['logo'] = theme('image_style', array('style_name' => 'medium', 'path' => $file_uri));

即使使用file_build_uri(),我最终也会得到一个不存在的文件的路径。如果我将图像移到文件目录并将$ file_uri更改为'public://logo.jpg',它就可以正常工作。

我是否需要将映像作为模块代码的一部分复制到文件目录?如果是这样,这可笑吗?

我想念什么?是否有关于如何执行此类操作的文档?我花了一个多小时来挖掘Drupal文档,然后完全干了。


public://sites/all/modules/my_module/logo.jpg有效地转换为site / default / files / sites / all / modules / my_module / logo.jpg-这就是上述方法不起作用的原因。猜猜我的问题是,如何避免仅通过theme_image_style运行文件来复制文件?
PrairieHippo

Answers:


4

不幸的是,这是设计使然。根据theme_image_style()文档对可接受参数的描述:

path:图像文件相对于Drupal文件目录的路径此功能不适用于文件目录之外的图像,也不适用于远程托管的图像。该格式应为“ images / image.jpg”之类的格式,或使用诸如“ public://images/image.jpg”之类的流包装器。

强调我的。

图像样式系统似乎只能在公共文件目录的上下文中使用(我不确定,也可以是私有的)。

最近,我遇到了类似情况,最终不得不自己编写代码(尽管我从核心映像模块中借了很多东西)。


谢谢-真的希望它不能这样工作,但是我想我可以推断出为什么开发人员选择这种方法。
PrairieHippo

9

我刚遇到这个问题,不得不编写代码来处理这个问题。

这有效地克隆theme_image_style()以在执行页面请求期间创建图像派生类。生成会绕过通常会触发404的安全问题,但这也意味着第一次访问该页面时页面会变慢。

我仅使用公共文件架构,但是我期望基于私有文件架构的样式会失败。

    /**
     * Implements hook_theme().
     */
    function MODULE_theme() {
      return array(
        'remote_image_style' => array(
          'variables' => array(
            'style_name' => NULL,
            'path' => NULL,
            'width' => NULL,
            'height' => NULL,
            'alt' => '',
            'title' => NULL,
            'attributes' => array(),
          ),
        ),
      );
    }

    /**
     * Returns HTML for an image using a specific image style.
     *
     * Clones theme_image_style() with the additional step of forcing the creation
     * of the derivative to bypass any 404 issues.
     */
    function theme_remote_image_style($variables) {
      // Determine the dimensions of the styled image.
      $dimensions = array(
        'width' => $variables['width'],
        'height' => $variables['height'],
      );
      image_style_transform_dimensions($variables['style_name'], $dimensions);

      $variables['width'] = $dimensions['width'];
      $variables['height'] = $dimensions['height'];

      $image_style_dest_path = image_style_path($variables['style_name'], $variables['path']);
      if (!file_exists($image_style_dest_path)) {
        $style = image_style_load($variables['style_name']);
        image_style_create_derivative($style, $variables['path'], $image_style_dest_path);
      }
      $variables['path'] = file_create_url($image_style_dest_path);
      return theme('image', $variables);
    }

2

theme_image_style() 使用PHP的流包装器(而非实际路径)接受URI。

input://是一个PHP的流封装,而public://private://temporary://是Drupal的为代表的流包装sites/default/files,专用和临时文件夹。

如果一定要使用的影像风格与模块中发现的图像,你可能要检查的system_stream_wrapper模块,它增加了module://theme://profile://library://流包装。

注意:这可能与当前问题无关,但是由于在其他帖子中已经提到,因此我还要指出remote_stream_wrapper模块,该模块添加了对使用http://,https://或feed:/的任何URL的支持。 /。如前所述,这些流包装器是只读的,不能执行任何写操作,但是我相信它可以与image_style_url()和相关的函数一起使用theme_image_style()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.