Themenbildstil für das Bild im Modulverzeichnis

10

Wahrscheinlich aus einer zu Drupal 6-Sicht, aber ...

Wie kann ich ein Bild in einem bestimmten Bildstil thematisieren, wenn sich dieses Bild in einem Modulordner befindet? Das macht mich verrückt und ich weiß, dass mir nur etwas Einfaches fehlt.

Hier ist ein Beispielcode, der zeigt, was ich versuche:

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

Selbst wenn ich file_build_uri () verwende, erhalte ich einen Pfad zu einer Datei, die nicht existiert. Wenn ich das Bild in das Dateiverzeichnis verschiebe und $ file_uri in 'public: //logo.jpg' ändere, funktioniert es einwandfrei.

Muss ich das Bild als Teil des Modulcodes in das Dateiverzeichnis kopieren? Wenn ja, ist das nicht lächerlich?

Was vermisse ich? Gibt es eine Dokumentation dazu? Ich habe über eine Stunde damit verbracht, die Drupal-Dokumentation abzubauen, und bin völlig trocken aufgetaucht.

PrairieHippo
quelle
public: //sites/all/modules/my_module/logo.jpg übersetzt effektiv in sites / default / files / sites / all / modules / my_module / logo.jpg - weshalb das oben genannte nicht funktioniert. Ich denke, die Frage ist, wie ich es vermeide, die Datei zu kopieren, um sie über theme_image_style auszuführen.
PrairieHippo

Antworten:

4

Leider ist das beabsichtigt. Aus der theme_image_style()Beschreibung der akzeptablen Parameter in den Dokumenten:

Pfad: Der Pfad der Bilddatei relativ zum Drupal- Dateiverzeichnis . Diese Funktion funktioniert weder mit Bildern außerhalb des Dateiverzeichnisses noch mit remote gehosteten Bildern . Dies sollte in einem Format wie 'images / image.jpg' oder mit einem Stream-Wrapper wie 'public: //images/image.jpg' erfolgen.

Hervorhebung von mir.

Es scheint, dass das Bildstilsystem nur im Kontext des Verzeichnisses für öffentliche Dateien funktioniert (möglicherweise auch privat, ich bin mir nicht sicher).

Ich bin kürzlich in eine ähnliche Situation geraten und musste sie schließlich selbst codieren (obwohl ich viel vom Kern-Image-Modul ausgeliehen habe).

Clive
quelle
Danke - ich wünschte wirklich, es hätte nicht so funktioniert, aber ich kann wohl herausfinden, warum die Entwickler diesen Ansatz gewählt haben.
PrairieHippo
9

Ich bin gerade darauf gestoßen und musste den Code schreiben, um damit umzugehen.

Dies klont effektiv theme_image_style(), um Bildableitungen während der Ausführung der Seitenanforderung zu erstellen. Die Generierung umgeht die Sicherheitsprobleme, die normalerweise einen 404 auslösen würden. Dies bedeutet jedoch auch eine langsamere Seite beim ersten Besuch der Seite.

Ich verwende nur das öffentliche Dateischema, aber ich würde erwarten, dass dies bei den auf privaten Dateischemas basierenden Stilen fehlschlägt.

    /**
     * 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);
    }
Ein Land.
quelle
2

theme_image_style() akzeptiert einen URI unter Verwendung der Stream-Wrapper von PHP und nicht realer Pfade.

input://ist ein Stream - Wrapper von PHP, während public://, private://und temporary://Drupal Stream Wrapper sind für die Darstellung der sites/default/filesprivaten und temporären Ordner.

Wenn Sie auf jeden Fall ein Bild Stil mit einem Bild in einem Modul gefunden verwenden müssen, können Sie das überprüfen system_stream_wrapper - Modul , das den hinzufügt module://, theme://, profile://und library://Stream - Wrapper.

Hinweis: Es mag für die aktuelle Frage irrelevant sein, aber da es in anderen Beiträgen erwähnt wurde, möchte ich auch auf das Modul remote_stream_wrapper verweisen, das Unterstützung für jede URL mit http: //, https: // oder feed: / hinzufügt / . Wie bereits erwähnt, sind diese Stream-Wrapper schreibgeschützt und können keine Schreibvorgänge ausführen. Ich glaube jedoch, dass sie mit image_style_url()und verwandten Funktionen wie verwendet werden können theme_image_style().

vensires
quelle