E-Mail Template Variable für Lieferzeit

Hallo zusammen, wir haben eine fertige Mail, aber es fehlt uns die Variable für Lieferzeiten. Gibt es eine Variable, bei der die Lieferzeit in der Bestellbestätigung ergänzt wird? Wie heißt die Variable? Evtl habt ihr einmal die HTML-Zeile für mich.

Viele Grüße
Martina

Probiere es mal mit:

{{ order.deliveries.at(0).shippingMethod.deliveryTime.translated.name }}
1 „Gefällt mir“

Andreas ich danke dir. Weißt du denn ob es auch einen Code gibt für die weit entfernteste Versandart? Also du hast drei Artikel und zwei haben 1-3 Tage und einer aber 2 Wochen. Dass dieser dann nur die 2 Wochen anzeigt? Oder aber wir kann ich die je nach Artikel im Warenkorb splitten innerhalb der einzelnen gekauften Produkte?

Ich habe dir leider nicht die richtige Variable gegeben - wie ich selber gerade sehe, gibt {{ order.deliveries.at(0).shippingMethod.deliveryTime.translated.name }} nur den Wert aus, der bei der Versandart als Lieferzeit angeben wurde - und dieser ist nicht Produktabhängig.

Eventuell gäbe es eine Möglichkeit.

Es gibt in der Bestellbestätigung die variablen {{ order.createdAt }} sowie {{ order.deliveries.at(0).shippingDateEarliest }} und {{ order.deliveries.at(0).shippingDateLatest }}

Das ist einmal der Zeitpunkt, an dem die Bestellung getätigt wurde, und der Lieferzeitraum, den Shopware berechnet - womöglich abhängig von dem Produkt mit der längsten Lieferzeit.

Man könnte in der Bestellbestätigung folgendes ergänzen:

{% set orderCreatedAt = order.createdAt|date_modify("+0 day") %}
{% set shippingDateEarliest = order.deliveries.at(0).shippingDateEarliest|date_modify("+0 day") %}
{% set shippingDateLatest = order.deliveries.at(0).shippingDateLatest|date_modify("+0 day") %}

{% set diffEarliest = orderCreatedAt.diff(shippingDateEarliest).days %}
{% set diffLatest = orderCreatedAt.diff(shippingDateLatest).days %}

Lieferzeit: ca. {{ diffEarliest }}-{{ diffLatest }} Werktage

Dann wird eine Zeile ausgegeben, die Lieferzeit heißt. Der Wert nach dem ca. ist die Zeitdifferenz von shippingDateEarliest minus orderCreatedAt sowie shippingDateLatest minus orderCreatedAt.

Es sollte dann eine Ausgabe ergeben im Sinne von: Lieferzeit ca. 5-10 Werktage.

Hi Andreas, danke für deine Rückmeldung. Schau mal anbei die Fotos des Templates. Es scheint noch irgendwo was verkehrt zu sein, zumindest zieht er die Lieferzeiten nicht aus den Produkten.

Viele liebe Grüße



Hi Martina,
laut diesem Thread steht die Lieferzeit nicht je Artikel zur Verfügung. Die Werte müssen per Plugin geholt werden.
https://forum.shopware.com/t/erweiterung-email-order-confirmation-lieferzeit-pro-artikel-wesentliches-merkmale-pro-artikel/69754

LG

Hi Martina, probiere es bitte mal so.

In deiner Bestellbestätigung ganz oben steht doch

{% set currencyIsoCode = order.currency.isoCode %}
{% set delivery = order.deliveries.first %}

Füge bitte nach diesen zwei o.g. Zeilen am Anfang der Bestellbestätigung diese Codeabschnitte ein:

{% set orderCreatedAt = order.createdAt|date_modify("+0 day") %}
{% set shippingDateEarliest = order.deliveries.at(0).shippingDateEarliest|date_modify("+0 day") %}
{% set shippingDateLatest = order.deliveries.at(0).shippingDateLatest|date_modify("+0 day") %}
{% set diffEarliest = orderCreatedAt.diff(shippingDateEarliest).days %}
{% set diffLatest = orderCreatedAt.diff(shippingDateLatest).days %}

Anschließend erst, dort wo du die Lieferzeit ausgegeben haben möchtest, den Code

Lieferzeit: ca. {{ diffEarliest }}-{{ diffLatest }} Werktage

Dann wird dir hier an dieser Stelle immer die Lieferzeit vom Artikel mit der längsten Lieferzeit ausgegeben. Nicht von jedem Artikel einzeln, aber die vom „langsamsten“ Artikel.

Bitte nicht vergessen, den Code auch in der Text-Version der Bestellbestätigung ebenso einzubauen.

1 „Gefällt mir“

Das sieht schon sehr gut aus. Nur bei z.B. 5 Artikeln bei der die Lieferzeit 1-3 Werktage beträgt. Gibt er mir folgendes aus:

Lieferzeit: ca. 0-2 Werktage

Wenn ich z.B. einen Artikel mit 4 Wochen Lieferzeit habe, macht er es richtig.

Viele Grüße

Schau hierzu mal unter Einstellungen > Lieferzeiten. Da steht „Minimum“ und „Maximum“ - ist bei den betreffenden 1-3 Werktage Artikeln evtl. als Minimum „0“ eingetragen? Dann könntest du das ändern von Minimum 1 auf Maximum 3 - damit die Berechnung in der Mail den Lieferzeitraum wieder korrekt berechnet, dann müsste er auch wieder ca. 1-3 Werktage anzeigen.

Hi Andreas ne da ist es korrekt. Schau.

Ist das ein Magic Trick? Oder was bringt eine Änderung des Datums um 0 Tage?

Seltsam. Hast du mal durchgeschaut, ob du evtl. eine Lieferzeit mit 0 Tagen hast? Oder was bei den Versandkosten für eine Lieferzeit hinterlegt ist?

Da der Code in zusammenarbeit mit KI entstanden ist, lasse ich hierauf auch gleich die KI Antworten :slight_smile:


Die Funktion date_modify("+0 day") in Twig (und ähnlichen Bibliotheken zur Datums-/Uhrzeitmanipulation) mag auf den ersten Blick überflüssig erscheinen, aber sie erfüllt einen bestimmten Zweck, auch wenn sie das Datum selbst nicht verändert. Hier ist eine Aufschlüsselung:

  1. Erstellung eines neuen DateTime-Objekts: Datums-/Uhrzeitobjekte in der Programmierung sind oft veränderlich (können direkt geändert werden) oder unveränderlich (können nicht direkt geändert werden; Änderungen erzeugen ein neues Objekt). date_modify("+0 day") erstellt immer ein neues DateTime-Objekt, auch wenn die Änderung Null ist. Dies ist wichtig, da Variablen in der Regel als Referenzen behandelt werden und wie Datums-/Uhrzeitobjekte an anderer Stelle im Code referenziert werden könnten.

  2. Sicherstellung eines konsistenten DateTime-Objekts: Die ursprünglichen Werte order.createdAt, order.deliveries.at(0).shippingDateEarliest und order.deliveries.at(0).shippingDateLatest könnten unterschiedlichen Typs oder Formats sein. Die Verwendung von date_modify("+0 day") stellt sicher, dass Sie im gesamten Twig-Template mit einem konsistenten DateTime-Objekt arbeiten. Dies ist besonders nützlich, wenn die ursprünglichen Datumswerte aus einer Datenbank oder einem externen System stammen, wo der Typ möglicherweise nicht garantiert ist. Es normalisiert die Daten.

  3. Vermeidung potenzieller Seiteneffekte: Wenn die ursprünglichen Datumsobjekte veränderlich sind und Sie später im Code andere Änderungen an ihnen vornehmen würden, ohne zuerst ein neues Objekt zu erstellen, könnten Sie versehentlich die ursprüngliche Datenquelle ändern. date_modify("+0 day") verhindert dies, indem es eine Kopie erstellt. Dies ist eine gute Vorgehensweise für die Datenintegrität.

  4. Typ-Hinweis oder Typumwandlung (manchmal): In einigen Systemen kann dies auch als eine Form von Typ-Hinweis oder Typumwandlung dienen. Auch wenn es das Datum nicht ändert, wird dem System (und jedem, der den Code liest) explizit mitgeteilt, dass Sie beabsichtigen, mit einem DateTime-Objekt zu arbeiten.

Zusammenfassend: Obwohl date_modify("+0 day") den Wert des Datums nicht ändert, ist es entscheidend für die Erstellung eines neuen, konsistenten und potenziell unveränderlichen DateTime-Objekts, wodurch unbeabsichtigte Seiteneffekte vermieden und die Datenintegrität sichergestellt werden. Es ist eine bewährte Vorgehensweise, insbesondere wenn Sie mit Datumsangaben aus externen Quellen arbeiten oder wenn Sie weitere Datumsmanipulationen planen.

Oder anders formuliert. Es ist völlig überflüssig, auch wenn es keinen Schaden anrichtet :joy:

Ja, das ist kompletter Blödsinn, denn die entity definitions sind klar definiert und die Methoden der entities haben klare return types. Hier braucht man nichts „sicher stellen“.

Viele Grüße

Ich habe die Lösung die KI lösen lassen. Sie sagt:

Die diff()-Methode von PHPs DateTime-Objekt gibt die Differenz zwischen zwei Datumswerten zurück, aber **ohne den Starttag mitzuzählen. Damit der erste Tag mitgezählt wird, solltest du einfach +1 zur Differenz addieren:

twig

KopierenBearbeiten

{% set diffEarliest = orderCreatedAt.diff(shippingDateEarliest).days + 1 %}
{% set diffLatest = orderCreatedAt.diff(shippingDateLatest).days + 1 %}

Jetzt würde eine ursprüngliche Lieferzeit von 1-3 Werktagen auch korrekt als 1-3 angezeigt werden, anstatt 0-2.

Gut zu wissen, das es auch ohne gehen sollte. Mir kam das auch seltsam vor, aber um das wirklich zu hinterfragen bin ich zu sehr Laie - ich war zufrieden, das der Code funktioniert :slight_smile:

Freut mich, das du es lösen konntest!

Hey Andreas du hast mir super geholfen! Bin echt froh, dass du es gelöst hast. Ich danke dir.