Estilo de imagen del tema para la imagen ubicada en el directorio del módulo

10

Probablemente llegue a esto desde un punto de vista de Drupal 6 demasiado, pero ...

¿Cómo tema una imagen en un estilo de imagen dado cuando esa imagen vive en una carpeta de módulo? Esto me está volviendo loco y sé que solo me falta algo simple.

Aquí hay un código de ejemplo que muestra lo que estoy tratando de hacer:

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

Incluso si uso file_build_uri (), termino con una ruta a un archivo que no existe. Si muevo la imagen al directorio de archivos y cambio $ file_uri a 'public: //logo.jpg', funciona bien.

¿Necesito copiar la imagen en el directorio de archivos como parte del código del módulo? Si es así, ¿no es esto ridículo?

¿Qué me estoy perdiendo? ¿Hay documentación sobre cómo hacer algo como esto? Pasé más de una hora extrayendo la documentación de Drupal y salí completamente seco.

PraderaHippo
fuente
public: //sites/all/modules/my_module/logo.jpg se traduce efectivamente en sites / default / files / sites / all / modules / my_module / logo.jpg, por lo que lo anterior no funciona. Supongo que la pregunta que tengo es, ¿cómo evito copiar el archivo solo para ejecutarlo a través de theme_image_style?
PrairieHippo

Respuestas:

4

Lamentablemente eso es por diseño. De la theme_image_style()descripción de los documentos de los parámetros aceptables:

ruta: la ruta del archivo de imagen en relación con el directorio de archivos de Drupal. Esta función no funciona con imágenes fuera del directorio de archivos ni con imágenes alojadas de forma remota . Esto debe estar en un formato como 'images / image.jpg', o utilizando un envoltorio de flujo como 'public: //images/image.jpg'.

El énfasis es mío.

Parece que el sistema de estilo de imagen solo funciona en el contexto del directorio de archivos públicos (tal vez también privado, no estoy seguro).

Me encontré con una situación similar recientemente y terminé teniendo que codificarlo yo mismo (aunque tomé prestado mucho del módulo de imagen central).

Clive
fuente
Gracias, realmente desearía que no funcionara de esta manera, pero supongo que puedo razonar por qué los desarrolladores eligieron este enfoque.
PrairieHippo
9

Acabo de encontrar esto y tuve que escribir el código para manejar esto.

Esto efectivamente clona theme_image_style()para crear derivados de imágenes durante la ejecución de la solicitud de página. La generación pasa por alto los problemas de seguridad que de otro modo normalmente desencadenarían un 404, pero eso también significa una página más lenta la primera vez que se visita la página.

Solo estoy usando el esquema de archivo público, pero espero que esto falle con los estilos basados ​​en el esquema de archivo privado.

    /**
     * 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);
    }
Una tierra.
fuente
2

theme_image_style() acepta un URI utilizando envoltorios de flujo de PHP y no rutas reales.

input://es un contenedor de flujo de PHP, mientras que public://, private://y temporary://son contenedores de flujo de Drupal para representar las sites/default/filescarpetas privadas y temporales.

Si definitivamente necesita utilizar un estilo de imagen con una imagen que se encuentra en un módulo, es posible que desee comprobar la system_stream_wrapper módulo que agrega los module://, theme://, profile://y library://envolturas de flujos.

Aviso: puede ser irrelevante para la pregunta actual, pero como se mencionó en otras publicaciones, me gustaría señalar también el módulo remote_stream_wrapper que agrega soporte para cualquier URL que use http: //, https: // o feed: / / . Sin embargo, como se mencionó, estos envoltorios de flujo son de solo lectura y no pueden realizar ninguna operación de escritura, pero creo que podría usarse con image_style_url()funciones relacionadas como theme_image_style().

vensires
fuente