web-dev-qa-db-fra.com

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

Venant probablement à cela à partir d'un trop grand nombre de points 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 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 dans le répertoire des fichiers et que je modifie $ 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.

10
PrairieHippo

Malheureusement, c'est par conception. À partir de la description --- theme_image_style() des documents des paramètres acceptables:

path: chemin du fichier image relatif au répertoire Drupal files. Cette fonction ne fonctionne pas avec les images en dehors du répertoire files ni avec les images hébergées à distance . Il doit s'agir d'un format tel que "images/image.jpg" ou d'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).

4
Clive

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);
    }
9
Alan D.

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

input:// Est le wrapper de flux PHP, tandis que public://, private:// Et temporary:// Sont les wrappers de flux de Drupal pour représenter le sites/default/files, Privé et temporaire Dossiers.

Si vous devez absolument utiliser un style d'image avec une image trouvée dans un module, vous voudrez peut-être vérifier le module system_stream_wrapper qui ajoute le module://, theme://, profile:// Et library:// Encapsuleurs de flux.

Remarque: Cela peut ne pas être pertinent pour la question actuelle, mais comme elle a été mentionnée 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'il pourrait être utilisé avec image_style_url() et des fonctions connexes comme theme_image_style().

2
vensires