Стиль изображения темы для изображения, расположенного в каталоге модуля


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 (), я получаю путь к файлу, который не существует. Если я переместу изображение в каталог files и изменим $ file_uri на public: //logo.jpg, все будет работать нормально.

Нужно ли копировать изображение в каталог файлов как часть кода модуля? Если так, разве это не смешно?

Что мне не хватает? Есть ли документация о том, как сделать что-то подобное? Я потратил более часа на разработку документации по Drupal и вышел полностью сухим.


public: //sites/all/modules/my_module/logo.jpg эффективно переводит на сайты / default / files / sites / all / modules / my_module / logo.jpg - поэтому вышеописанное не работает. Угадайте, у меня вопрос, как мне избежать копирования файла только для запуска его через theme_image_style?
PrairieHippo

Ответы:


4

К сожалению, это по замыслу. Из theme_image_style()описания документов допустимых параметров:

путь: путь к файлу изображения относительно каталога файлов 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() принимает URI с использованием потоковых оболочек PHP, а не реальных путей.

input://является РНР потока обертка, в то время как public://, private://и temporary://являются потоковыми упаковщиками в Drupal для представления sites/default/files, частные и временных папок.

Если вам обязательно нужно использовать стиль изображения с изображением найденного в модуле, вы можете проверить system_stream_wrapper модуль , который складывает module://, theme://, profile://и library://поток обертки.

Обратите внимание: это может не относиться к текущему вопросу, но, поскольку он упоминался в других публикациях, я хотел бы также указать на модуль remote_stream_wrapper, который добавляет поддержку любого URL-адреса с использованием http: //, https: // или feed: / / . Как уже упоминалось, эти потоковые оболочки доступны только для чтения и не могут выполнять никаких операций записи, но я считаю, что их можно использовать с image_style_url()такими функциями, как theme_image_style().

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.