Tema Immagine Stile per l'immagine situata nella directory del modulo


10

Probabilmente arriva da questo dal punto di vista di Drupal 6 ma ...

Come tema un'immagine in un determinato stile di immagine quando l'immagine vive in una cartella del modulo? Questo mi sta facendo impazzire e so che mi manca qualcosa di semplice.

Ecco un esempio di codice che mostra cosa sto cercando di fare:

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

Anche se uso file_build_uri (), finisco con un percorso a un file che non esiste. Se sposto l'immagine nella directory dei file e cambio $ file_uri in 'public: //logo.jpg', funziona perfettamente.

Devo copiare l'immagine nella directory dei file come parte del codice del modulo? Se è così, non è ridicolo?

Cosa mi sto perdendo? Esiste una documentazione su come fare qualcosa del genere? Ho passato più di un'ora a estrarre la documentazione di Drupal e mi sono ritrovato completamente asciutto.


public: //sites/all/modules/my_module/logo.jpg si traduce efficacemente in siti / default / file / siti / tutti / moduli / mio_modulo / logo.jpg - motivo per cui quanto sopra non funziona. Indovina la domanda che ho è, come posso evitare di copiare il file solo per eseguirlo tramite theme_image_style?
PrairieHippo,

Risposte:


4

Sfortunatamente questo è di progettazione. Dalla theme_image_style()descrizione dei documenti dei parametri accettabili:

percorso: il percorso del file immagine relativo alla directory dei file Drupal. Questa funzione non funziona con immagini esterne alla directory dei file né con immagini ospitate in remoto . Questo dovrebbe essere in un formato come 'images / image.jpg' o usando un wrapper di flusso come 'public: //images/image.jpg'.

Enfasi mia.

Sembra che il sistema di stili di immagine funzioni solo nel contesto della directory dei file pubblici (forse anche privato, non ne sono sicuro).

Di recente mi sono imbattuto in una situazione simile e alla fine ho dovuto codificarlo da solo (anche se ho preso molto in prestito dal modulo immagine principale).


Grazie - vorrei davvero che non funzionasse in questo modo, ma suppongo di poter ragionare sul motivo per cui gli sviluppatori hanno scelto questo approccio.
PrairieHippo,

9

Mi sono appena imbattuto in questo e ho dovuto scrivere il codice per gestirlo.

Questo clona efficacemente theme_image_style()per creare derivati ​​dell'immagine durante l'esecuzione della richiesta di pagina. La generazione ignora i problemi di sicurezza che normalmente innescerebbero un 404, ma ciò significa anche una pagina più lenta la prima volta che la pagina viene visitata.

Sto usando solo lo schema di file pubblico, ma mi aspetto che ciò fallisca con gli stili basati sullo schema di file privato.

    /**
     * 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() accetta un URI usando i wrapper di flusso di PHP e non i percorsi reali.

input://è un wrapper di flusso di PHP, mentre public://, private://e temporary://sono i wrapper di flusso di Drupal per rappresentare le sites/default/filescartelle private, temporanee.

Se è assolutamente necessario utilizzare uno stile di immagini con un'immagine trovata in un modulo, si potrebbe voler controllare lo system_stream_wrapper modulo che aggiunge i module://, theme://, profile://e library://involucri flusso.

Avviso: potrebbe essere irrilevante per la domanda attuale, ma poiché è stato menzionato in altri post, vorrei anche puntare al modulo remote_stream_wrapper che aggiunge il supporto per qualsiasi URL usando http: //, https: // o feed: / / . Come già detto, questi wrapper di flusso sono di sola lettura e non possono eseguire alcuna operazione di scrittura, ma credo che potrebbero essere utilizzati con image_style_url()funzioni correlate come theme_image_style().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.