Wie finde ich eine URL im Bildstil in einer Zweigvorlage?

9

Ich implementiere eine Knotenvorlage, die ein Bild zweimal verwendet. einmal auf "normale" Weise (dh unter Verwendung des Bildstils, der in der Anzeigekonfiguration des Felds für diesen Ansichtsmodus definiert ist), und der andere ist als CSS-Hintergrundbildeigenschaft.

Ich brauche eines von zwei Dingen:

  1. (idealerweise) eine Möglichkeit, die URL für einen anderen Bildstil desselben Bildes abzurufen.

  2. eine Möglichkeit, die URL für das Bildfeld abzurufen.

Ich kämpfe darum , eine Antwort zu finden dump()und kint()mir selbst zu helfen. Beide geben viel zu viel aus (dank eingebetteter Links zu "Eltern" usw.) und scheinen nicht die Informationen zu haben, die ich brauche. Wenn Sie beispielsweise die dump(content.field_image)Ausgabe betrachten, ist die tatsächliche URL des Bildes nicht vorhanden (woher kommt sie also, sodass sie mit {{ content.field_image }}?! gerendert werden kann ?). kint()Auf der anderen Seite stirbt es komplett, wenn ich ihm ein Argument übergebe und die Top-Level-Version wieder viel zu groß ist, um zu navigieren. Das Debuggen war mit phptemplate + xdebug so viel einfacher. (Ja, ich weiß, dass es gut ist, dass Themen die Datenbank nicht löschen können.)

Es gibt eine Antwort auf (1), die impliziert, dass Sie dies nicht tun können , aber ich verstehe nicht, warum ich die vorhandene URL in (2) nicht erhalten kann.

Kunstroboter
quelle

Antworten:

10

Sie können die URL des Bildstils in einer Vorverarbeitungsfunktion abrufen und an die Knotenvorlage übergeben. (In meinem Fall brauchte ich auf Seitenebene, ich vermute, das würde immer noch für Knoten funktionieren)

In etwa so: "myimagefield" ist der Computername für Ihr Bildfeld und "myimagestyle" ist der Computername für Ihren Stil. Stellen Sie außerdem sicher, dass Sie Entity \ ImageStyle einschließen.

use Drupal\image\Entity\ImageStyle;

/**
 * Implements hook_preprocess_page().
*/
function mytheme_preprocess_page(&$variables, $hook) {
  if ($variables['node']) {
    $node = $variables['node'];
    if($node->myimagefield[0]){
        $cover_image = $node->myimagefield[0]->entity->getFileUri();
        $image_url = ImageStyle::load('myimagestyle')->buildUrl($cover_image);
        $variables['my_image'] = $image_url;
    }
  }
}
Greg
quelle
1
Die Frage besagt, dass der Ansichtsmodus aus der Anzeigekonfiguration des Felds entfernt werden soll. Mit $ image_url = ImageStyle :: load ('myimagestyle') -> buildUrl ($ cover_image); Wie ziehen Sie den Bildstil aus der Feldkonfiguration? Sie haben einfach myimagestyle hinzugefügt, aber was ist, wenn sich dasselbe Feld auf mehreren Entitäten (z. B. Knoten) befindet, für die unterschiedliche Bildstile erforderlich sind?
usernameabc
12

Der erste Teil ist bereits in der verknüpften Frage beantwortet, wo es den Code gibt, wie das geht. Um den zweiten Teil der Frage zu beantworten, können Sie auf das Originalbild im Knotenobjekt zugreifen:

{{ file_url(node.field_image.entity.uri.value) }}

Eine Bemerkung über content:

In einer Knotenvorlage kann das Bildfeld in contentnicht gerendert werden. Das Feld enthält die Konfiguration, wie es angezeigt werden soll, und das Feldobjekt, das alle Rohdaten enthält. Später wird dies im Feld, Bildformatierer und Bildvorlagen zusammengestellt. Aus diesem Grund finden Sie die gesuchte URL derzeit nicht content.

In der Knotenvorlage können Sie die Felder auf der obersten Ebene des Inhaltsarrays verwenden, z. B. das Bildfeld anzeigen

{{ content.field_image }}

wie im Ansichtsmodus konfiguriert.

Bearbeiten:

Es gibt einen neuen Filter im Modul Twig Tweak . Jetzt können Sie die URL des Bildstils im Zweig direkt aus einer URL oder URL des Originalbilds generieren:

{{ node.field_image.entity.uri.value | image_style('thumbnail') }} 
4k4
quelle
Vielen Dank. Also werden alle Preprocess-Hooks aufgerufen, wenn Zweigaufrufe gerendert werden, z. B. an dem Punkt, an dem Sie gehen {{ content.field_image }}und nicht vorher? Ich denke auch, dass die URL, die ich aus Ihrem Vorschlag erhalte, die ursprüngliche URL ist - Teil 2 meines Q fragte nach der URL des Bildstils, wie sie im Ansichtsmodus konfiguriert wird. Ist das möglich?
Artfulrobot
Dies funktioniert nur für regelmäßig hochgeladene Bilder und nicht für Bilder, auf die Entitäten verweisen. Wie kann dies dazu gebracht werden, mit Bildern zu arbeiten, auf die Entitäten verweisen?
Paulcap1
@ paulcap1, weiß nicht genau, was du meinst, da ein Bildfeld ein Referenzfeld ist (auf eine Dateientität). Wenn Sie meinen, dass sich das Bild in einer referenzierten Entität befindet, benötigen Sie .entityzweimal, erstens, um zur Entität zu gelangen, und zweitens, um zum Bild zu gelangen.
4k4
1
@ Paulcap1, zum Beispiel{{ node.field_ref.entity.field_image.entity.uri.value }}
4k4
@ 4k4. Ich verwende den Standard-Seiteninhaltstyp. Ich habe ein entitätsreferenziertes Feld namens field_global_image. Dies verwendet das Image Bundle. Das Bildfeld "Bundles" heißt "" image ". Ich habe es auf Ihre Weise mit {{node.field_global_image.entity.image.entity.uri.value}} versucht. Ich habe auch versucht, die Felder wie folgt zu wechseln {{node.image.entity.field_global_image .entity.uri.value}} Weder hat funktioniert. In meiner Antwort in einem separaten Beitrag hat das für mich funktioniert.
paulcap1
6

Installieren Sie das Twig Tweak-Modul https://www.drupal.org/project/twig_tweak

Und dieses Modul Twig Field https://www.drupal.org/project/twig_field_value

Wenn Sie reguläre Bild-Upload-Feldbilder verwenden, verwenden Sie diese in Ihrer Knotenvorlage:

<img src="{{ node.field_regular_image.entity.uri.value | image_style('thumbnail') }} " >

Wenn Sie ein Entitätsreferenzbild verwenden, verwenden Sie Folgendes:

<img src="{{ file_url(content.field_global_image|field_target_entity.image.entity.uri.value | image_style('thumbnail'))}} " >
paulcap1
quelle
Beachten Sie, dass im Beispiel zur Verwendung referenzierter Entitäten imagenach field_target_entityauf das Bildfeld der referenzierten Entität verwiesen wird. Möglicherweise müssen Sie es anpassen.
Daniels
1
Vielen Dank! Das Entitätsreferenzbeispiel kann auch ohne das Modul twig_field_value ausgeführt werden durch:file_url(node.field_image.entity.field_referenced_image.entity.uri.value | image_style('thumbnail'))
John