Style d'image de thème pour l'image située dans le répertoire du module

10

Venant probablement à cela d'un trop grand point de vue Drupal 6 mais ...

Comment puis-je thème une image dans un style d'image donné lorsque cette image vit dans un dossier de module? Cela me rend fou et je sais que je manque juste quelque chose de simple.

Voici un exemple de code montrant ce que j'essaie de faire:

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

Même si j'utilise file_build_uri (), je me retrouve avec un chemin vers un fichier qui n'existe pas. Si je déplace l'image vers le répertoire des fichiers et que je change le $ file_uri en «public: //logo.jpg», cela fonctionne très bien.

Dois-je copier l'image dans le répertoire des fichiers dans le cadre du code du module? Si oui, n'est-ce pas ridicule?

Qu'est-ce que je rate? Existe-t-il une documentation sur la façon de faire quelque chose comme ça? J'ai passé plus d'une heure à explorer la documentation Drupal et je suis complètement sec.

PrairieHippo
la source
public: //sites/all/modules/my_module/logo.jpg se traduit efficacement par sites / default / files / sites / all / modules / my_module / logo.jpg - c'est pourquoi cela ne fonctionne pas. Je suppose que la question que je me pose est la suivante: comment éviter de copier le fichier juste pour l'exécuter à travers theme_image_style?
PrairieHippo

Réponses:

4

Malheureusement, c'est par conception. D'après la theme_image_style()description des paramètres acceptables par les documents:

chemin: Le chemin du fichier image par rapport au répertoire des fichiers Drupal. Cette fonction ne fonctionne pas avec les images en dehors du répertoire des fichiers ni avec les images hébergées à distance . Cela devrait être dans un format tel que «images / image.jpg», ou en utilisant un wrapper de flux tel que «public: //images/image.jpg».

Je souligne.

Il semble que le système de style d'image ne fonctionne que dans le contexte du répertoire des fichiers publics (peut-être aussi privé, je ne suis pas sûr).

J'ai rencontré récemment une situation similaire et j'ai fini par devoir la coder moi-même (bien que j'aie beaucoup emprunté au module d'image de base).

Clive
la source
Merci - j'aimerais vraiment que cela ne fonctionne pas de cette façon, mais je suppose que je peux comprendre pourquoi les développeurs ont choisi cette approche.
PrairieHippo
9

Je viens de découvrir cela et j'ai dû écrire le code pour gérer cela.

Cela clone efficacement theme_image_style()pour créer des dérivés d'image lors de l'exécution de la demande de page. La génération contourne les problèmes de sécurité qui autrement déclencheraient normalement un 404, mais cela signifie également une page plus lente la première fois que la page est visitée.

J'utilise uniquement le schéma de fichier public, mais je m'attends à ce que cela échoue avec les styles basés sur le schéma de fichier privé.

    /**
     * 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);
    }
Un terrain.
la source
2

theme_image_style() accepte un URI utilisant les wrappers de flux de PHP et non des chemins réels.

input://est un wrapper de flux PHP, tandis que public://, private://et temporary://sont des wrappers de flux de Drupal pour représenter les sites/default/filesdossiers privés et temporaires.

Si vous avez certainement besoin d'utiliser un style d'image avec une image trouvée dans un module, vous pouvez vérifier le system_stream_wrapper module qui ajoute les module://, theme://, profile://et library://enveloppes de flux.

Remarque: cela peut ne pas être pertinent pour la question actuelle, mais comme il a été mentionné dans d'autres articles, je voudrais également pointer vers le module remote_stream_wrapper qui ajoute la prise en charge de toute URL utilisant http: //, https: // ou feed: / / . Comme mentionné cependant, ces wrappers de flux sont en lecture seule et ne peuvent effectuer aucune opération d'écriture, mais je pense qu'ils pourraient être utilisés avec image_style_url()des fonctions connexes comme theme_image_style().

vensires
la source