Tema Imagem Estilo para a imagem localizada no diretório do módulo

10

Provavelmente chegando a esse ponto de vista do Drupal 6, mas ...

Como tema uma imagem em um determinado estilo de imagem quando ela fica em uma pasta de módulo? Isso está me deixando maluco e sei que estou perdendo algo simples.

Aqui está um exemplo de código mostrando o que estou tentando fazer:

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

Mesmo se eu usar file_build_uri (), acabarei com um caminho para um arquivo que não existe. Se eu mover a imagem para o diretório de arquivos e alterar o $ file_uri para 'public: //logo.jpg', funcionará perfeitamente.

Preciso copiar a imagem no diretório de arquivos como parte do código do módulo? Se sim, isso não é ridículo?

o que estou perdendo? Existe documentação sobre como fazer algo assim? Passei mais de uma hora pesquisando a documentação do Drupal e fiquei completamente seco.

PrairieHippo
fonte
public: //sites/all/modules/my_module/logo.jpg se traduz efetivamente em sites / default / files / sites / all / modules / my_module / logo.jpg - e é por isso que o exposto acima não funciona. Acho que a pergunta que tenho é: como evito copiar o arquivo apenas para executá-lo no theme_image_style?
PrairieHippo

Respostas:

4

Infelizmente isso é por design. A partir da theme_image_style()descrição dos documentos dos parâmetros aceitáveis:

caminho: o caminho do arquivo de imagem em relação ao diretório de arquivos do Drupal. Esta função não funciona com imagens fora do diretório de arquivos nem com imagens hospedadas remotamente . Ele deve estar em um formato como 'images / image.jpg' ou usando um wrapper de fluxo como 'public: //images/image.jpg'.

Ênfase minha.

Parece que o sistema de estilo de imagem só funciona no contexto do diretório de arquivos públicos (talvez privado também, não tenho certeza).

Eu me deparei com uma situação semelhante recentemente e acabei tendo que codificá-la eu mesmo (embora tenha emprestado muito do módulo de imagem principal).

Clive
fonte
Obrigado - realmente gostaria que não funcionasse dessa maneira, mas suponho que posso entender por que os desenvolvedores escolheram essa abordagem.
PrairieHippo
9

Acabei de descobrir isso e tive que escrever o código para lidar com isso.

Isso efetivamente clona theme_image_style()para criar derivadas de imagem durante a execução da solicitação de página. A geração ignora os problemas de segurança que normalmente acionariam um 404, mas isso também significa uma página mais lenta na primeira vez que a página é visitada.

Estou usando apenas o esquema de arquivo público, mas espero que isso falhe com os estilos baseados no esquema de arquivo 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);
    }
Uma terra.
fonte
2

theme_image_style() aceita um URI usando wrappers de fluxo do PHP e caminhos não reais.

input://é um wrapper de fluxo do PHP public://, private://e temporary://são os wrappers do Drupal para representar as sites/default/filespastas privadas e temporárias.

Se você definitivamente precisa usar um estilo de imagem com uma imagem encontrada em um módulo, você pode querer verificar o system_stream_wrapper módulo que adiciona as module://, theme://, profile://e library://wrappers de fluxo.

Aviso: Pode ser irrelevante para a pergunta atual, mas como foi mencionado em outras postagens, eu também gostaria de apontar para o módulo remote_stream_wrapper que adiciona suporte para qualquer URL usando http: //, https: // ou feed: / / . Como mencionado, porém, esses wrappers de fluxo são somente leitura e não podem executar nenhuma operação de gravação, mas acredito que poderia ser usado com image_style_url()funções relacionadas como theme_image_style().

vensires
fonte