Textbaustein nur ausgeben wenn gefüllt

Hallo zusammen!

Ich suche nach einer Möglichkeit, einen Textbaustein mit Code drumherum im Template nur tatsächlich auszugeben, wenn auch was drin steht, so a la

{% if mein.Textbaustein != "" %}

  <h2>Meine Überschrift</h2>
  {{ "mein.Textbaustein"|trans }}

{% endif %}

Der Vergleich {% „mein.Textbaustein“ != „“ %} ist wohl immer True …

Ich möchte aber, dass der zusätzliche Code (hier: h2) nur ausgegeben wird, wenn im Textbaustein auch was drin steht.

Hintergrund: Ich möchte über die Textbausteine aktuelle Hinweise auf der Confirmation Page im Checkout anzeigen und nicht jedes mal das Template anpassen.

Jemand einen Hinweis für mich?

LG
Carsten

Hallo @essenzenladen !

Es geht ganz einfach mit:

{% if Textbaustein|length > 0 %}

Oder sogar nur:

{% if Textbaustein %}

Shopware selbst verwendet beide Varianten. Vom Ergebnis her konnte ich bisher keinen Unterschied feststellen.

VG
finsti

Hallo @finsti,

danke für die Antwort. Ich habe es ausprobiert (mit und ohne Anführungszeichen), jedoch scheint es nicht zu klappen. Das was Du beschreibst, funktioniert auf jeden Fall mit Variablen, die in Twig zur Verfügung stehen. Aber mit Textbausteinen wohl nicht.

Hast Du eine Fundstelle im SW6 Basistemplate, wo die das so machen?

LG
Carsten

Hallo @essenzenladen ,

Entschuldige - ich hatte überlesen, dass es um Snippets geht, nicht um Custom Fields.
So ist es auch kein Problem, aber du musst einen kleinen Umweg gehen mit einer Hilfsvariable:

{% set snippetExists = "Textbaustein"|trans|length > 0 %}

Danach kannst du die if-Abfrage machen:

{% if snippetExists %}

Ein Beispiel, wo Shopware das selbst verwendet, findest du z.B. in der buy-widget-price.html.twig

Viel Erfolg! :slight_smile:

Hallo @finsti,

danke für die Antwort. Das ist jedoch leider auch nicht die Lösung, da der Compiler den Textbaustein wegen der Anführungszeichen einfach als String interpretiert.

"Textbaustein"|length

ergibt unabhängig vom Inhalt des Snippets immer 12, weil das die Länge des Strings „Textbaustein“ ist.

Hast Du noch eine andere Idee?

LG
Carsten

Hallo @essenzenladen ,

Du schreibst natürlich nicht den String „Textbaustein“ in die Anführungszeichen sondern die Quelle des Snippets - also im Beispiel der buy-widget-price.html.twig z.B.:

{% set afterListPriceSnippetExists = "listing.afterListPrice"|trans|length > 0 %}

Ich habe es mit einem eigenen Snippet in meinem Custom Theme ausprobiert und es funktioniert einwandfrei.

LG
finsti

Hallo @finsti

Du schreibst natürlich nicht den String „Textbaustein“ in die Anführungszeichen sondern die Quelle des Snippets - also im Beispiel der buy-widget-price.html.twig z.B.:

Das ist natürlich klar. Der Name meines Textbausteins hat 34 Zeichen. Das Prinzip ist jedoch dasselbe - der Name des Textbausteins wird einfach selbst als String interpretiert, ohne den Inhalt auszuwerten.

Ich habe es mit einem eigenen Snippet in meinem Custom Theme ausprobiert und es funktioniert einwandfrei.

Und der gibt Dir tatsächlich unterschiedliche Längen zurück, wenn der Textbaustein leer bzw. gefüllt ist?

LG
Carsten

Ich habe gerade noch ein wenig rumgetestet. Das Problem scheint zu sein, dass SW6 den Namen des Textbausteins zurückgibt, wenn dieser leer ist, und keinen leeren String. Das hier ist mein Template Code:

{% set snippetExists = "Essenzenladen.checkout.infoMessage"|trans|length > 0 %}

<p>Länge: {{"Essenzenladen.checkout.infoMessage"|trans|length}}<br />
snippetExists: {{ snippetExists }}</p>

{% if snippetExists %}
<div class="home-info-message">
    <div class="info-title">{{ "Essenzenladen.checkout.infoMessageLabel"|trans|sw_sanitize }}</div>
    <div class="info-message">{{ "Essenzenladen.checkout.infoMessage"|trans|sw_sanitize }}</div>
</div>

{% endif %}

Ist der Textbaustein gefüllt, stimmt die Länge:

Ist der Textbaustein leer, sieht es so aus:

Mal sehen, was passiert, wenn ich einen Dummy-Text einsetze (ist aber nur ein blöder Workaround).

LG
Carsten

Hallo @finsti,

so, dieser Code funktioniert jetzt:

{% if "Essenzenladen.checkout.infoMessage"|trans|length > 35 %}
<div class="home-info-message">
    <div class="info-title">{{ "Essenzenladen.checkout.infoMessageLabel"|trans|sw_sanitize }}</div>
    <div class="info-message">{{ "Essenzenladen.checkout.infoMessage"|trans|sw_sanitize }}</div>
</div>
{% endif %}

Er hinterlässt aber einen doofen Beigeschmack … ich halte es erstens für seltsam, dass Shopware den Namen eines Textbausteins ausgibt, wenn derselbe eigentlich leer ist. Weiterhin kann ich mit diesem Code keine Texte < 35 Zeichen anzeigen lassen. Ich könnte zwar auf == 34 prüfen, aber wenn es der Teufel so will, hat der Text, den ich anzeigen lassen möchte ebenfalls exakt 34 Zeichen.

Hat da jemand vielleicht weitere Informationen oder eine Lösung zu?

LG
Carsten

Hallo,

an sich stammt der trans-Filter von Symfony, weiß aber leider nicht, ob Shopware da noch was erweitert.
Aber an sich ist es bei mir so, daß wenn gar kein Eintrag vorhanden ist für den Textbaustein, dann wird der Textbaustein zurückgegeben. Wenn er vorhanden ist, aber z.B. „“ ist, dann wird bei mir zumindest „“ zurückgegeben.

Aber auch egal. Könntest du nicht einfach prüfen ob der übersetzte String ungleich „Essenzenladen.checkout.infoMessage“ ist und Länge > 0 hat?

Gruß,
Werner.

Prüfe doch einfach ob die Übersetzung nicht dem Namen des Texbausteinname entspricht:

{% if "Essenzenladen.checkout.infoMessage"|trans != "Essenzenladen.checkout.infoMessage" %}
    ...
{% endif %}
2 „Gefällt mir“

Hallo @essenzenladen ,

Die Lösung funktioniert definitiv wie beschrieben, ich habe es gerade nochmals getestet. Ich tippe auch darauf, dass etwas mit deinem Snippet nicht stimmt.

VG
finsti

@WernerBu

Aber auch egal. Könntest du nicht einfach prüfen ob der übersetzte String ungleich „Essenzenladen.checkout.infoMessage“ ist und Länge > 0 hat?

Habe ich auch dran gedacht, jedoch wird ja der Snippet Name in Anführungszeichen interpretiert, weshalb „snippet.name“ != „snippet.name“ IMMER falsch ist, da ja beide Seiten auf dieselbe Weise interpretiert werden.

LG
Carsten

Hmm … welche SW Version fährst Du denn?

LG
Carsten

Das klingt nach einem guten Workaround. Jedoch bin ich immer noch der Meinung, dass ein leeres Snippet auch als leerer String interpretiert werden sollte und nicht als sein technical name …

Sehe ich auch so. Verstehe nicht, warum kein leerer String erlaubt ist. Ich mache ein Leerzeichen rein oder ein leeres HTML Tag: &nbsp; oder <span></span>. Funktioniert auch als Workaround.

Hallo,
verstehe nicht, wieso bei Euch kein leerer String erlaubt ist, bei mir wird ein leerer String auch als leerer String mit „trans“ zurückgegeben. Nur wenn eben der Textbaustein gar nicht definiert ist, wird bei mir der Textbaustein selbst wieder zurückgegeben. Ansonsten würde für mich, dass was Shopware in buy-widget-price.html.twig programmiert hat, auch keinen großen Sinn ergeben.

Oder ich mach komplett was falsch…
Ist das wirklich bei allen so wie bei @essenzenladen @AlexGalax beschrieben?

Gruß,
Werner.

Ich habe mir mal die Datei angesehen - da wird auf normale Variablen geprüft (ohne Anführungszeichen), nicht auf Textbausteine (mit Anführungszeichen). Oder habe ich was übersehen? :thinking:

LG
Carsten

Jein, diese beiden Textbausteine

{% set afterListPriceSnippetExists = "listing.afterListPrice"|trans|length > 0 %}
{% set beforeListPriceSnippetExists = "listing.beforeListPrice"|trans|length > 0 %}

werden in snippet/de_DE/storefront.de-DE.json mit leerem String als default gesetzt. Deswegen kann man die auch als leeren String speichern. Wenn man einen anderes dort definiertes Snippet mit leerem String versucht zu speichern, wird der dort definierte Default-Wert genommen. Dort nicht definierte Textbausteine haben als Default-Wert ihren technischen Namen.

Also hat man noch die Möglichkeit, den Textbaustein in den snippet.json zu definieren. Ist aber auch keine tolle Lösung, wenn man einen Text als Default-Wert haben möchte und trotzdem ein leerer String zulässig sein soll.

Beste Lösungen:

Wert auf technischen Namen prüfen:

{% if "Essenzenladen.checkout.infoMessage"|trans != "Essenzenladen.checkout.infoMessage" %}

oder Leerzeichen: &nbsp;
oder leerer Tag: <span></span>