# CustomFields in Mail Template verwenden

**URL:** <https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869>\
**Category:** Programmierung\
**Created:** [30. März 2020 um 12:45 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869 "2020-03-30T12:45:12Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Shopware6User](https://avatars.discourse-cdn.com/v4/letter/s/ed8c4c/32.png) [@Shopware6User](https://forum.shopware.com/u/Shopware6User)\
**Post date:** [30. März 2020 um 12:45 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/1 "2020-03-30T12:45:12Z")

</div>

Hallo zusammen,

Ich komme gerade nicht weiter und bin um jede Hilfe froh:

- Kontext: Bei jeder Bestellung wählt der Kunde ein Lieferdatum aus. Dieses speichere ich als customField in der ‚order\_delivery‘ DB (siehe screenshot). Das ganze funktioniert einwandfrei und ich kann das customField problemlos im Frontend verwenden. Aber…
- Problem: Ich möchte dieses Feld nun im Mail-Template der Bestellbestätigung verwenden mittels `{{ order.deliveries.first.customFields.deliveryDate }}`. Das führt dazu, dass keine Bestellbestätigung mehr verschickt wird, da es das customField wahrscheinlich nicht findet und deshalb irgendwo abbricht…
- Frage: Es sollte schon grundsätzlich möglich sein customFields in Mail-Templates zu verwenden? Falls ja, mache ich irgenwas mit der twig-syntax falsch?

Unten noch ein Screenshot des Mail-Templates und das customField in der Datenbank:

![](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/2X/a/ac23beb29a6bd8a8b0a10982056d7753e2b75c3a.png)

 ![](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/2X/1/11a1d20cbda67d6c88c57fc95c9bad13bb0c5d60.png)

**Update: Habe das Problem gefunden. Das customField war nicht verfügbar, da es zum Zeitpunkt, an dem der MailerService auf die ‚order‘ zugreift noch nicht geladen wurde. Musste es jetzt ziemlich umständlich lösen, indem ich den CartService extende.**

**Thread kann geschlossen werden.**

&nbsp;

---

<div class="post-metadata">

**Author:** ![Shopware6User](https://avatars.discourse-cdn.com/v4/letter/s/ed8c4c/32.png) [@Shopware6User](https://forum.shopware.com/u/Shopware6User)\
**Post date:** [30. März 2020 um 13:49 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/2 "2020-03-30T13:49:18Z")

</div>

Zur Ergänung hier noch der entsprechende log-Eintrag:

```
app.ERROR: Could not render Mail-Template with error message: Failed rendering string template using Twig: Impossible to access an attribute ("deliveryDate") on a null variable [...]

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![Schmuh](https://avatars.discourse-cdn.com/v4/letter/s/7ab992/32.png) [@Schmuh](https://forum.shopware.com/u/Schmuh)\
**Post date:** [30. Juli 2020 um 12:30 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/3 "2020-07-30T12:30:32Z")

</div>

Hi @Shopware6User‍,

ich strehe grade vor dem selben Problem. Kannst du deine Lösung evtl. hier teilen?

Viele Grüße

---

<div class="post-metadata">

**Author:** ![codiverse](https://avatars.discourse-cdn.com/v4/letter/c/b782af/32.png) [@codiverse](https://forum.shopware.com/u/codiverse)\
**Post date:** [17. November 2020 um 11:02 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/4 "2020-11-17T11:02:14Z")

</div>

Hat hier inzwischen jemand Erfahrungen mit gemacht?

Wir erstellen das Custom Field in der Install Methode so:

```
$customFieldSetRepository = $this->container->get('custom_field_set.repository');

        $customFieldSetRepository->create([
            [
                'name' => 'myfield_set',
                'global' => true,
                'config' => [
                    'label' => [
                        'de-DE' => 'xxx',
                        'en-GB' => 'xxx'
                    ]
                ],
                'relations' => [[
                    'entityName' => 'order'
                ]],
                'customFields' => [
                    ['name' => 'myfield', 'type' => CustomFieldTypes::DATETIME],
                ]
            ]
        ], Context::createDefaultContext());

```

Wie gehe ich jetzt am besten vor, um das Feld in die Mail-Templates zu bekommen?

---

<div class="post-metadata">

**Author:** ![kanuma](https://avatars.discourse-cdn.com/v4/letter/k/ce7236/32.png) [@kanuma](https://forum.shopware.com/u/kanuma)\
**Post date:** [2. Dezember 2020 um 13:29 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/5 "2020-12-02T13:29:19Z")

</div>

&nbsp;

@Shopware6User‍ Wie hast du es denn nun gemacht?

---

<div class="post-metadata">

**Author:** ![codiverse](https://avatars.discourse-cdn.com/v4/letter/c/b782af/32.png) [@codiverse](https://forum.shopware.com/u/codiverse)\
**Post date:** [21. Januar 2021 um 15:09 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/6 "2021-01-21T15:09:02Z")

</div>

\*push\*

Hat hier jemand inzwischen neue Infos?

---

<div class="post-metadata">

**Author:** ![kommad](https://avatars.discourse-cdn.com/v4/letter/k/96bed5/32.png) [@kommad](https://forum.shopware.com/u/kommad)\
**Post date:** [28. Januar 2021 um 15:46 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/7 "2021-01-28T15:46:34Z")

</div>

Push! Würde uns auch interessieren

---

<div class="post-metadata">

**Author:** ![Shopware6User](https://avatars.discourse-cdn.com/v4/letter/s/ed8c4c/32.png) [@Shopware6User](https://forum.shopware.com/u/Shopware6User)\
**Post date:** [28. Januar 2021 um 16:57 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/8 "2021-01-28T16:57:04Z")

</div>

&nbsp;

Hallo zusammen, ich bin hier noch eine Antwort schuldig:

Vorneweg: Ich konnte für dieses Problem keine saubere Lösung finden. Die unstenstehende Lösung ist **nicht empfehlenswert** und sehr **anfällig für zukünftige Updates** , da es interne Klassen überschreibt!

Ich überschreibe den **OrderService** mit folgendem:

```
public function createOrder(DataBag $data, SalesChannelContext $context): string
    {
        $c = new \ReflectionClass(OrderService::class);
        $validateOrderDataMethod = $c->getMethod('validateOrderData');
        $addCustomerCommentMethod = $c->getMethod('addCustomerComment');
        $addAffiliateTrackingMethod = $c->getMethod('addAffiliateTracking');
        $validateCartMethod = $c->getMethod('validateCart');

        $validateOrderDataMethod->setAccessible(true);
        $addCustomerCommentMethod->setAccessible(true);
        $addAffiliateTrackingMethod->setAccessible(true);
        $validateCartMethod->setAccessible(true);

        // get additional data from request object
        $customFields = $data->only('deliveryDate');

        $validateOrderDataMethod->invoke($this, $data, $context);

        $cart = $this->cartService->getCart($context->getToken(), $context);
        $addCustomerCommentMethod->invoke($this, $cart, $data);
        $addAffiliateTrackingMethod->invoke($this, $cart, $data);

        $validateCartMethod->invoke($this, $cart, $context->getContext());
        // pass customField as parameter
        return $this->cartService->order($cart, $context, $customFields);
    }

```

Und den&nbsp; **CartService** :

```
    public function order(Cart $cart, SalesChannelContext $context, Array $customFields = null): string
    {
// dd($customFields);
        $orderId = $this->orderRoute->order($cart, $context, $customFields)->getOrder()->getId();

        if (isset($this->cart[$cart->getToken()])) {
            unset($this->cart[$cart->getToken()]);
        }

        return $orderId;
    }

```

Vielleicht hilfts ja einigen von euch. &nbsp;@kommad, @codeiverse, @kanuma, @Schmuh

---

<div class="post-metadata">

**Author:** ![codiverse](https://avatars.discourse-cdn.com/v4/letter/c/b782af/32.png) [@codiverse](https://forum.shopware.com/u/codiverse)\
**Post date:** [2. Februar 2021 um 13:02 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/9 "2021-02-02T13:02:16Z")

</div>

Danke für das Feedback @Shyim‍ ?

---

<div class="post-metadata">

**Author:** ![shyim](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/shyim/32/7681_2.png) [@shyim](https://forum.shopware.com/u/shyim)\
**Post date:** [9. Februar 2021 um 14:32 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/10 "2021-02-09T14:32:28Z")

</div>

Ihr könnt euch eigentlich an das Event&nbsp;\Shopware\Core\Checkout\Cart\Order\CartConvertedEvent subscriben und die Daten aus dem Cart um mappen in die Order.&nbsp;Dann sollte es im OrderPlacedEvent auch zur verfügung stehen.

---

<div class="post-metadata">

**Author:** ![codiverse](https://avatars.discourse-cdn.com/v4/letter/c/b782af/32.png) [@codiverse](https://forum.shopware.com/u/codiverse)\
**Post date:** [11. Februar 2021 um 17:21 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/11 "2021-02-11T17:21:29Z")

</div>

Hi zusammen,

wenn ich es mache im OrderSubscriber:

```
public static function getSubscribedEvents(): array
    {
        return[
            CheckoutOrderPlacedEvent::class => 'onOrderPlaced',
        ];
    }

    /**
     * @param CheckoutOrderPlacedEvent $event
     * @throws \Exception
     */
    public function onOrderPlaced(CheckoutOrderPlacedEvent $event)
    {

        $orderId = $event->getOrder()->getId();
        $context = $event->getContext();

        $deliverydate = $this->session->get('deliverydate', null);

        if($deliverydate) {
            $this->orderRepository->upsert([[
                'id' => $orderId,
                'customFields' => ['dtgs_delivery_date' => $deliverydate]
            ]], $context);
        }

        $existingCustomFields = $event->getOrder()->getCustomFields();
        if(!$existingCustomFields) $existingCustomFields = [];
        //add delivery date
        $deliverydateCustomFields = [
            'deliveryDate' => $deliverydate
        ];
        $mergedCustomFields = array_merge($existingCustomFields, $deliverydateCustomFields);
        $event->getOrder()->setCustomFields($mergedCustomFields);

        //unset session key
        $this->session->remove('deliverydate');

    }

```

Ist mein Datum in der Bestellbestätigung verfügbar über **{{ order.customFields.deliveryDate }}**

In den anderen Mailtemplates muss ich aber **{{order.customFields.dtgs\_delivery\_date}}** verwenden und es ist dort auch anders formatiert. Warum ist das so? Bzw. war es so schon die ganze Zeit dort verfügbar?

Und kann mir noch jemand einen Hinweis geben, wie ich das Datum in den Lieferscheinen unterbringen kann?

---

<div class="post-metadata">

**Author:** ![misterli](https://avatars.discourse-cdn.com/v4/letter/m/c67d28/32.png) [@misterli](https://forum.shopware.com/u/misterli)\
**Post date:** [14. April 2021 um 10:35 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/12 "2021-04-14T10:35:26Z")

</div>

Wie hast du es denn hinbekommen, dass das Datumsfeld in den Bestellungen bearbeitbar ist?

Bei mir ist weiterhin das Feld „Read-Only“ ohne Bearbeitungsmöglichkeiten.

---

<div class="post-metadata">

**Author:** ![Ni\_Bo](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/ni_bo/32/18912_2.png) [@Ni\_Bo](https://forum.shopware.com/u/Ni_Bo)\
**Post date:** [20. April 2021 um 14:33 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/13 "2021-04-20T14:33:13Z")

</div>

Werden die Custom Fields in der DB gefüllt wenn die Bestellung erstellt wird?  
In dem Fall wird das Mail Template nicht darauf zugreifen können, da es zu spät passiert sodass die Informationen für den Mailer nicht zur Verfügung stehen.

Generell für den Anwendungsfall, dass man Custom Fields von Bestellungen für die Bestellbestätigungs-Email verwenden will sollte man dafür am besten über das CartConvertedEvent die custom Fields direkt mitgeben, sodass diese im Konvertierungsprozess von Cart zu Order schon gleich übernommen werden.

In dieser Beispiel Funktion rufe ich in einem Subscriber eine Kunden Referenz aus einem Textfeld ab und füge diese als Custom Field Key in das Cart ein.

```
public function onCartConvertedEvent(CartConvertedEvent $event): void {

    $customerReference = $this->requestStack->getCurrentRequest()->request->get('customer- reference');

    $cart = $event->getConvertedCart();
    $cart['customFields']['customer_reference'] = $customerReference;

    $event->setConvertedCart($cart);
}

```

Danach kann ich den Wert von „customer\_reference“ in dem Mail Template zur Bestellbestätigung unter  
` order.customFields.customer_reference`  
abrufen.

Ich bedanke mich an dieser Stelle bei meiner Kollegin die mir bei diesem Ansatz geholfen hat.  
Wir hatten zuvor das gleiche Problem bezüglich der Bestellbestätigung und konnten es erst nach viel Recherche und rumprobieren lösen.

Ich hoffe diese Antwort kann auch einigen anderen hier weiterhelfen.

---

<div class="post-metadata">

**Author:** ![der-bergmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/der-bergmann/32/19498_2.png) [@der-bergmann](https://forum.shopware.com/u/der-bergmann)\
**Post date:** [13. Januar 2023 um 12:18 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/14 "2023-01-13T12:18:22Z")

</div>

Hi @Ni_Bo, könnten Sie mir bitte sagen, in welcher Datei Sie das geändert/hinzugefügt haben? Ich habe es in der CartConvertedEvent.php hinzugefügt aber leider werden mir meine Custom Fields immer noch nicht im E-Mail Template angezeigt…

---

<div class="post-metadata">

**Author:** ![Ni\_Bo](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/ni_bo/32/18912_2.png) [@Ni\_Bo](https://forum.shopware.com/u/Ni_Bo)\
**Post date:** [13. Januar 2023 um 12:40 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/15 "2023-01-13T12:40:29Z")

</div>

Nein, nicht in der CartConvertedEvent.php  
Der Code muss in einem eigenen Subscriber implementiert werden.  
Bzgl. Implementieren von Subscribern in einem eigenen Plugin: [https://developer.shopware.com/docs/guides/plugins/plugins/plugin-fundamentals/listening-to-events](https://developer.shopware.com/docs/guides/plugins/plugins/plugin-fundamentals/listening-to-events).  
Die Funktion wird dann vom Subscriber aufgerufen wenn das Event ausgelöst wird.

Dazu ist es aber notwendig in der `getSubscribedEvents` Methode des Subscribers eine Referenz auf die Methode einzubinden:

```auto
public static function getSubscribedEvents(): array {
        return [
            CartConvertedEvent::class => 'onCartConvertedEvent'
        ];
    }

```

Damit weiß der Subscriber welche Methode aufgerufen werden soll, wenn das Event ausgelöst wird.

---

<div class="post-metadata">

**Author:** ![der-bergmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/der-bergmann/32/19498_2.png) [@der-bergmann](https://forum.shopware.com/u/der-bergmann)\
**Post date:** [13. Januar 2023 um 12:42 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/16 "2023-01-13T12:42:39Z")

</div>

@Ni_Bo Vielen Dank für die Schnelle Antwort! Ich werde das dann mal ausprobieren.

Ich bin noch etwas unerfahren und wir haben folgendes Problem:  
Wir haben Zusatzfelder für Produkte erstellt und diese sollen bei der Bestellung eben mit übermittelt werden und auch in der Bestellbestätigung angezeigt werden. Hilft Ihre Lösung mir dabei? oder ist Ihre Lösung für Felder in der Bestellbestätigung?

---

<div class="post-metadata">

**Author:** ![Ni\_Bo](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/ni_bo/32/18912_2.png) [@Ni\_Bo](https://forum.shopware.com/u/Ni_Bo)\
**Post date:** [13. Januar 2023 um 13:08 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/17 "2023-01-13T13:08:55Z")

</div>

@der-bergmann Also das Anzeigen der CustomFields von Produkten ist durchaus möglich.  
Dabei kann der Ansatz in der oben beschriebenen Lösung grundsätzlich verwendet werden, aber die Umsetzung ist etwas komplexer.

Ich habe hier mal auf die Schnelle die Funktion angepasst um den Anwendungsfall ungefähr abzudecken zur Veranschaulichung:

```auto
public function onCartConvertedEvent(CartConvertedEvent $event): void {
    
    $customFieldName = 'name_deines_customfields';
    $originalCart = $event->getCart();
    $cart = $event->getConvertedCart();
    $lineItems = $cart['lineItems'];
    $referencedCartLineItems = $originalCart->getLineItems();
    
    foreach ($lineItems as $index => $lineItem) {
        $id = $lineItem['identifier'];
        $referencedLineItem = $referencedCartLineItems->get($id);
        if ($referencedLineItem != NULL) {
            $referencedPayload = $referencedLineItem->getPayload();
            $deinCustomField = $referencedPayload[$customFieldName];
            $cart['lineItems'][$index]['payload']['customFields'][$customFieldName] = $deinCustomField;
        }
    }

    $event->setConvertedCart($cart);
}

```

Damit kann man CustomFields der Produkte im Warenkorb in den Mailtemplates theoretisch auslesen.  
Ich kann aber nicht garantieren, dass der Code ohne Anpassungen problemlos funktioniert, da ich ihn teils aus meiner Erinnerung gerade geschrieben und nicht getestet habe.

Hoffentlich hilft das weiter!

---

<div class="post-metadata">

**Author:** ![der-bergmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/der-bergmann/32/19498_2.png) [@der-bergmann](https://forum.shopware.com/u/der-bergmann)\
**Post date:** [13. Januar 2023 um 14:08 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/18 "2023-01-13T14:08:46Z")

</div>

@Ni_Bo super vielen lieben Dank!

---

<div class="post-metadata">

**Author:** ![der-bergmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/der-bergmann/32/19498_2.png) [@der-bergmann](https://forum.shopware.com/u/der-bergmann)\
**Post date:** [13. Januar 2023 um 14:34 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/19 "2023-01-13T14:34:55Z")

</div>

@Ni_Bo müssen die CustomFields im Warenkorb sichtbar sein, damit man diese über order.customFields.mein\_custom\_field auslesen kann im Mail Template? Denn bis jetzt sind die Custom Fields nur auf der Produkt-Detailseite im Frontend sichtbar…

---

<div class="post-metadata">

**Author:** ![Ni\_Bo](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/ni_bo/32/18912_2.png) [@Ni\_Bo](https://forum.shopware.com/u/Ni_Bo)\
**Post date:** [13. Januar 2023 um 15:12 UTC](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869/20 "2023-01-13T15:12:43Z")

</div>

Nein sie müssen nicht unbedingt sichtbar sein.  
Die CustomFields die sich auf Produkte beziehen kann man in den Mail Templates durch die LineItems wiedergeben.  
So in etwa:

```auto
{% for lineItem in order.lineItems %}
    {{ lineItem.payload.customFields.dein_custom_field }}
{% endfor %}

```

[Nächste Seite](https://forum.shopware.com/t/customfields-in-mail-template-verwenden/65869.md?page=2)
