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.
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?
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
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.
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.
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?
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:
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?
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?
Die Lösung funktioniert definitiv wie beschrieben, ich habe es gerade nochmals getestet. Ich tippe auch darauf, dass etwas mit deinem Snippet nicht stimmt.
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.
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: 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?
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?
{% 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:
oder leerer Tag: <span></span>