it-swarm.com.de

Themenbildstil für das Bild im Modulverzeichnis

Vermutlich kommt dies aus zu großer Sicht von Drupal 6), 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.

10
PrairieHippo

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

pfad: Der Pfad der Bilddatei relativ zum Dateiverzeichnis Drupal files. 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).

4
Clive

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

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

input:// Ist der Stream-Wrapper eines PHP, während public://, private:// Und temporary:// Drupals Stream-Wrapper für die Darstellung des privaten und temporären sites/default/files Sind Ordner.

Wenn Sie definitiv einen Bildstil mit einem in einem Modul gefundenen Bild verwenden müssen, sollten Sie das Modul system_stream_wrapper überprüfen, das das module:// Hinzufügt. , 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:/hinzufügt /, https: // oder feed: //. Wie bereits erwähnt, sind diese Stream-Wrapper schreibgeschützt und können keine Schreibvorgänge ausführen, aber ich glaube, dass sie mit image_style_url() und verwandten Funktionen wie theme_image_style() verwendet werden können. .

2
vensires