Стиль зображення теми для зображення, що знаходиться в каталозі модулів


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 ефективно перекладається на сайти / за замовчуванням / файли / сайти / всі / модулі / my_module / logo.jpg - ось чому вищезгадане не працює. Здогадайтесь, у мене є питання, як я можу уникнути копіювання файлу просто для запуску через topic_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.