Verfügbare Variablen
In jeder Formel stehen dir die folgenden Variablen zur Verfügung. Du greifst mit einem Punkt auf die Eigenschaften zu, zum Beispiel cart.price.totalPrice.
Gewichte werden – wie am Produkt gepflegt – in Kilogramm geliefert, Maße (Länge, Breite, Höhe) in Millimetern.
cart – der gesamte Warenkorb
| Eigenschaft | Bedeutung |
|---|---|
cart.price.totalPrice | Warenkorbsumme, wie sie der Kunde im Warenkorb sieht |
cart.price.netPrice | Warenkorbsumme netto |
{{ cart.price.totalPrice >= 100 ? 0 : 4.90 }}
positions – die versandfähigen Artikel dieser Lieferung
Die praktischste Variable für Gewicht und Menge: Sie enthält nur die Artikel, die tatsächlich versendet werden (keine Rabatte oder Gutscheine), und rechnet die bestellte Menge bereits mit ein.
| Eigenschaft | Bedeutung |
|---|---|
positions.weight | Gesamtgewicht in kg (Gewicht je Stück mal Menge, über alle Artikel summiert) |
positions.quantity | Gesamtstückzahl über alle Artikel |
positions.volume | Gesamtvolumen in mm³ (aus Länge, Breite, Höhe der Produkte) |
positions.lineItems | Die einzelnen Artikel (siehe lineItems unten) |
{{ 3.90 + positions.weight * 0.50 }}
lineItems – die einzelnen Artikel
lineItems enthält alle Positionen des Warenkorbs, positions.lineItems nur die versandfähigen – für Versandkosten ist fast immer positions.lineItems die richtige Wahl. Je Artikel stehen unter anderem bereit:
| Eigenschaft | Bedeutung |
|---|---|
item.quantity | Bestellte Menge |
item.label | Bezeichnung des Artikels |
item.payload.productNumber | Produktnummer |
item.price.unitPrice | Einzelpreis |
item.price.totalPrice | Positionssumme |
item.deliveryInformation.weight | Gewicht je Stück in kg |
item.deliveryInformation.length | Länge in mm |
item.deliveryInformation.width | Breite in mm |
item.deliveryInformation.height | Höhe in mm |
item.deliveryInformation.freeDelivery | Häkchen „Versandkostenfrei" am Produkt |
Über die Artikel gehst du am besten mit den Twig-Werkzeugen filter, map und max – zum Beispiel: Länge des längsten Artikels:
{{ max(positions.lineItems | map(item => item.deliveryInformation.length ?? 0)) }}
Nicht jeder Artikel hat alle Angaben gepflegt. Mit ?? 0 setzt du einen Ersatzwert, falls eine Angabe fehlt – so bricht die Formel nicht ab.
Wichtig: das Ergebnis von filter nur einmal verwenden
Das Ergebnis von filter ist ein „Einweg-Durchlauf": Es kann in der Formel nur ein einziges Mal durchlaufen werden. Speicherst du es in einer Variablen und verwendest es zweimal – oder steckst es direkt in max() bzw. min() – schlägt die Formel mit der Meldung „Cannot rewind a generator that was already run" fehl (der Kunde sieht dann den blockierenden Versandkosten-Hinweis, der genaue Fehler steht im Log).
So bleibst du auf der sicheren Seite:
- Schließe eine
filter-Kette immer in einem Zug ab – mitmap,reduceoderlengthdahinter. - Wende
max()undmin()nie direkt auf einfilter-Ergebnis an, sondern immer auf einmap-Ergebnis (das ist eine feste Liste): erstmap, dannmax. - Brauchst du gefilterte Artikel mehrfach, wiederhole die
filter-Kette an jeder Stelle, statt sie in einer Variablen zwischenzuspeichern.
{# Sicher: filter -> map -> reduce in einem Zug #}
{{ positions.lineItems
| filter(item => not (item.deliveryInformation.freeDelivery ?? false))
| map(item => (item.deliveryInformation.weight ?? 0) * item.quantity)
| reduce((summe, gewicht) => summe + gewicht, 0) }}
{# Fehlschlag: max() direkt auf einem filter-Ergebnis #}
{{ max(positions.lineItems | filter(item => item.quantity > 1)) }}
delivery – die Lieferung
| Eigenschaft | Bedeutung |
|---|---|
delivery.location.country.iso | Lieferland als Kürzel, z. B. DE, AT, CH |
delivery.location.country.name | Name des Lieferlands |
delivery.location.address.zipcode | Postleitzahl der Lieferadresse |
delivery.location.address.city | Ort der Lieferadresse |
{{ delivery.location.country.iso == 'CH' ? 14.90 : 5.90 }}
Die Lieferadresse ist erst bekannt, wenn der Kunde eingeloggt ist bzw. sie im Checkout angegeben hat. Greife auf delivery.location.address deshalb immer mit einem Ersatzwert zu, z. B. delivery.location.address.zipcode ?? ''.
customer und customerGroup – Kunde und Kundengruppe
| Eigenschaft | Bedeutung |
|---|---|
customer | Der eingeloggte Kunde – leer, solange niemand eingeloggt ist |
customer.customerNumber | Kundennummer |
customerGroup.translated.name | Name der aktuellen Kundengruppe |
{{ customer ? 4.90 : 5.90 }}
Für Unterscheidungen nach Kundengruppe, Land oder Bestellwert sind die „Regelbasierten Formeln" mit Rule-Builder-Regeln meist die bessere Wahl – sie sind ohne Formelkenntnisse pflegbar und lassen sich frei kombinieren. Die Variablen brauchst du vor allem zum Rechnen.
Weitere Variablen
| Variable | Bedeutung |
|---|---|
currency.isoCode | Aktive Währung, z. B. EUR, CHF |
currency.factor | Umrechnungsfaktor der Währung zur Standardwährung |
shippingMethod.translated.name | Name der Versandart |
salesChannel.translated.name | Name des Verkaufskanals |
salesChannelContext | Der komplette Verkaufskanal-Kontext (für Spezialfälle) |
Das Formel-Ergebnis wird nicht automatisch umgerechnet – es gilt in der Währung, in der bestellt wird. Möchtest du einen Euro-Preis in anderen Währungen anbieten, multipliziere mit dem Faktor:
{{ 4.90 * currency.factor }}
Fertige Vorlagen für alle Variablen findest du in den Formel-Beispielen.