# Hinzugefügter Wert im Cart LineItem Payload wird nicht an E-Mail Template durchgereicht

**URL:** <https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909>\
**Category:** Programmierung\
**Created:** [23. August 2022 um 10:46 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909 "2022-08-23T10:46:22Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![AndiMu](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/andimu/32/15941_2.png) [@AndiMu](https://forum.shopware.com/u/AndiMu)\
**Post date:** [23. August 2022 um 10:46 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/1 "2022-08-23T10:46:22Z")

</div>

Hallo,  
ich möchte gerne in meinem Subscriber den Cart LineItem Payload mit eigenen Werten erweitern. Nachdem ich das Produkt dem Warenkorb hinzugefügt habe, erscheinen diese auch im Debugging im Payload. Leider gehen diese dann auf dem Weg zum Mail-Template verloren.  
Ich benutze im Moment die die SW 6.4.14.0

```auto
    public static function getSubscribedEvents(): array
    {
        return [
            AfterLineItemAddedEvent::class => 'afterLineItemAdded',
            MailBeforeValidateEvent::class => 'mailBeforeSent',
        ];
    }  

```

Hier werden die Werte hinzugefügt und können im Debugger im Objekt gesehen werden:

```auto
public function afterLineItemAdded(AfterLineItemAddedEvent $event)
    {
        // liefert alle im Warenkorb befindlichen LineItems
        $cartLineItems = $event->getCart()->getLineItems(); // Shopware\Core\Checkout\Cart\LineItem\LineItemCollection
        
        foreach ($cartLineItems as $lineItem) {
            $packUnits = array("packUnit"=>"Karton", "packUnitPlural"=>"Kartons");
            $lineItem->setPayloadValue("packUnits", $packUnits);
        }
    }

```

und hier sind diese Werte „verloren gegangen“. Die neuen Werte im Payload tauchen in $data nicht mehr auf

```auto
public function mailBeforeSent(MailBeforeValidateEvent $event)
    {
        $data = $event->getTemplateData();
        error_log(print_r($data, true)."\n", 3, getcwd().'/data_getTemplateData.log');
    }

```

1. Kann es sein, dass es das LineItemAddedEvent nicht mehr gibt? Ich habe nur die Before- und AfterLineItemAdded-Events gefunden.
2. Weiss jemand was ich falsch mache oder kann mir vielleicht jemand zum Problem einen Tipp geben?

Vielen Dank  
Beste Grüsse  
Andreas

---

<div class="post-metadata">

**Author:** ![FritzPerson](https://avatars.discourse-cdn.com/v4/letter/f/85e7bf/32.png) [@FritzPerson](https://forum.shopware.com/u/FritzPerson)\
**Post date:** [23. August 2022 um 13:53 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/2 "2022-08-23T13:53:02Z")

</div>

Wenn das ein After-Event ist, dann wird was du dort einträgst eventuell gar nicht übernommen, bzw. ins Mail-Template kommt wahrscheinlich nur was auch in der Datenbank steht.

Die Einträge im Admin-Bereich Kataloge → Produkte → (Produkt) Bearbeiten → Spezifikation → Verpackungseinheit & Verpackungseinheit-Mehrzahl werden in die Tabelle product\_translation als pack\_unit & pack\_unit\_plural gespeichert, und stehen im Template über (Twig) product.translated.packUnit & product.translated.packUnitPlural zur Verfügung.

---

<div class="post-metadata">

**Author:** ![AndiMu](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/andimu/32/15941_2.png) [@AndiMu](https://forum.shopware.com/u/AndiMu)\
**Post date:** [23. August 2022 um 14:31 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/3 "2022-08-23T14:31:34Z")

</div>

> [@FritzPerson](#):
>
> product.translated

Hallo FritzPerson, vielen Dank für deine Antwort 🙂  
Wenn ich mich nicht irre, dann habe ich im Mail-Template (Bestätigungs-Mail) nur Zugriff auf das order-Objekt inklusive dazugehörigen Payload. Ich kann auf das Feld product.translated.packUnit nur auf page-Objekt Ebene zugreifen und nicht im Mail-Template, oder doch? Wenn ich aber z.B. ein Zusatzfeld im Produkt anlege dann wird das bis in die Order durchgeschleift und ich kann mittels lineItem.payload.customFields.name\_zusatzfeld auf das Zusatzfeld zugreifen. Das funktioniert einwandfrei. Ich möchte aber nach Möglichkeit auf das Zusatzfeld verzichten und stattdessen das Feld Verpackungseinheit aus der Produkt-Spezifikation in meiner Bestätigungs-Email verwenden. Auf das von Dir vorgeschlagene Feld product.translated.packUnit kann ich in dem Mail-Template nicht zugreifen. Oder verstehe ich hier irgendetwas falsch?  
Nachtrag: In der Tabelle order\_line\_item wird im Feld Payload der Payload der Order gespeichert. Aus irgendwelchen Gründen wird meine programmatische Erweiterung des Payloads nicht dort gespeichert und ich weiss nicht warum.

---

<div class="post-metadata">

**Author:** ![FritzPerson](https://avatars.discourse-cdn.com/v4/letter/f/85e7bf/32.png) [@FritzPerson](https://forum.shopware.com/u/FritzPerson)\
**Post date:** [23. August 2022 um 16:48 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/4 "2022-08-23T16:48:47Z")

</div>

@AndiMu Ich dachte man käme über LineItem an Product, aber das geht anscheinend im Template nicht. Habe es eben probiert, z.B. auch order.lineItems.first.product.packUnit.

Wenn du trotzdem irgendwo einen Wert hast, an dem abhängt ob Karton oder Kartons in der Mail stehen soll, dann könntest du eventuell auch ein Twig if/else/endif ins Template einbauen, also z.B:

```auto
{% if lineItem.quantity > 1 %}
Kartons
{% else %}
Karton
{% endif %}

```

---

<div class="post-metadata">

**Author:** ![AndiMu](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/andimu/32/15941_2.png) [@AndiMu](https://forum.shopware.com/u/AndiMu)\
**Post date:** [24. August 2022 um 07:12 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/5 "2022-08-24T07:12:17Z")

</div>

Guten Morgen FritzPerson,  
ich danke Dir für deinen Vorschlag. Leider ist dieser nicht anwendbar, da ich mich nicht darauf verlassen kann, dass sich die Verpackungseinheit auf Produktebene nicht unterscheiden kann. Ich werde also weiter tüfteln und hier hoffentlich (irgendwann 🙂 ) eine fertige Lösung bereitstellen.

---

<div class="post-metadata">

**Author:** ![FritzPerson](https://avatars.discourse-cdn.com/v4/letter/f/85e7bf/32.png) [@FritzPerson](https://forum.shopware.com/u/FritzPerson)\
**Post date:** [24. August 2022 um 08:21 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/6 "2022-08-24T08:21:13Z")

</div>

@AndiMu: Ah OK, vielleicht wäre dann noch eine Option: [Add data to mails - Shopware Developer](https://developer.shopware.com/docs/guides/plugins/plugins/content/mail/add-data-to-mails)

Ich denke theoretisch könnte man sogar das bestehende templateData-Array erweitern, ja nachdem was schon drin steht.

---

<div class="post-metadata">

**Author:** ![AndiMu](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/andimu/32/15941_2.png) [@AndiMu](https://forum.shopware.com/u/AndiMu)\
**Post date:** [24. August 2022 um 09:31 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/7 "2022-08-24T09:31:34Z")

</div>

Vielen Dank für deinen Hinweis auf [Add data to mails - Shopware Developer](https://developer.shopware.com/docs/guides/plugins/plugins/content/mail/add-data-to-mails).  
Wenn ich das Event **MailBeforeValidateEvent** und z.B. den Code

```auto
$data = $event->getTemplateData();
$data["testKey"] = "Ich bin ein Test";
$event->setTemplateData($data);

```

verwende, dann kann ich auf dieses Feld im Mail-Template mittels `{{ testKey }}` zugreifen. Das ähnelt dem [Add data to mails - Shopware Developer](https://developer.shopware.com/docs/guides/plugins/plugins/content/mail/add-data-to-mails) Vorgehen.

Die Herausforderung ist jedoch, dass ich, bezogen auf meine LineItems, unterschiedliche Angaben im Payload haben möchte/könnte. Im unwahrscheinlichsten Fall könnte ich z.B. zehn Produkte mit zehn unterschiedlichen Verpackungseinheiten haben. Und diese möchte ich gerne hinter der gewünschten Menge in der Bestätigungs-Mail ebenfalls aufzeigen.  
Als Hilfe benutze ich im Moment ein Custom\_Field im Produkt um die Verpackungseinheit zu hinterlegen. Das Feld wird nämlich anstandslos bis in die Order mitgenommen. Darauf kann ich auch im Mail-Template einfach zugreifen.

Ich werde weiter tüfteln un danke Dir 🙂

---

<div class="post-metadata">

**Author:** ![FritzPerson](https://avatars.discourse-cdn.com/v4/letter/f/85e7bf/32.png) [@FritzPerson](https://forum.shopware.com/u/FritzPerson)\
**Post date:** [24. August 2022 um 10:09 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/8 "2022-08-24T10:09:50Z")

</div>

@AndiMu, dein Vorgehen mit dem CustomField klingt für mich zumindest als sei es die beste Lösung.

Wegen der Typisierung in PHP könntest du theoretisch schon jedes Objekt in $data anpassen. Z.B. mit einer eigenen Klasse die von OrderLineItemEntity erbt und eigene Variablen enthält, also bspw. MyOrderLineItemEntity mit einer Variable public string $myString. Dann könntest du in MailBeforeValidateEvent so etwas machen:

```auto
/** @var MyOrderLineItemEntity $lineItem */
foreach ($data['order']['lineItems'] as $lineItem) { // nicht sicher ob $data['order']['lineItems'] richtig ist
    $lineItem->myString = "test";
}

```

Aber ich weiß nicht wie sinnvoll das ist, und es wird auch bei jeder Mail gemacht.

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [24. August 2022 um 10:51 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/9 "2022-08-24T10:51:12Z")

</div>

Hallo @AndiMu, wenn dein Payload der LineItem hinzugefügt worden ist, und dieser auch in der DB gespeichert wird (order\_line\_items), dann kannst du im E-Mail Template mit `{{ nestedItem.payload.PAYLOADNAME }}` auf den Payload zugreifen.

So wie ich dich verstanden habe, wird dein Payload aber nicht in der DB gespeichert?  
Da du auf das Event AfterLineItemAddedEvent lauschst, müsstest du den Cart noch persistieren, damit deine Änderungen übernommen werden. Wenn du den BeforeLineItemAddedEvent verwendest, sollte dein Payload auch in der DB gespeichert werden.

vg

---

<div class="post-metadata">

**Author:** ![AndiMu](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/andimu/32/15941_2.png) [@AndiMu](https://forum.shopware.com/u/AndiMu)\
**Post date:** [24. August 2022 um 12:53 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/10 "2022-08-24T12:53:20Z")

</div>

@FritzPerson Auf den ersten Blick würde ich sagen, das dies vielleicht auch ein gangbarer Weg für die Erweiterung des Payloads mit Mail-Template Ausgabe wäre. Vielen Dank für deinen Input 🙂

@abdullah Der Wechsel auf das BeforeLineItemAddedEvent hat mir die Lösung gebracht. Der Payload wird jetzt persistiert (Tab. order\_line\_item) und ich kann wie von Dir beschrieben auf die Felder in meinem Mail-Template zugreifen. Vielen Dank für deine Hilfe 🙂

Ich werde auf jeden Fall hier noch die Lösung dokumentieren.

Schönen Tag euch Beiden und beste Grüsse  
Andreas

---

<div class="post-metadata">

**Author:** ![AndiMu](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/andimu/32/15941_2.png) [@AndiMu](https://forum.shopware.com/u/AndiMu)\
**Post date:** [25. August 2022 um 09:38 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/11 "2022-08-25T09:38:20Z")

</div>

Für diejenigen die es interessiert, ist hier meine Lösung:

```auto
private EntityRepository $productRepository;

public function __construct(EntityRepository $productRepository)
    {
        $this->productRepository = $productRepository;
    }

public static function getSubscribedEvents(): array
    {
        return [
            BeforeLineItemAddedEvent::class => 'beforeLineItemAdded'
        ];
    }

public function beforeLineItemAdded(BeforeLineItemAddedEvent $event)
    {
      
        // liefert neu hinzugefügtes LineItem im Warenkorb
        $lineItem = $event->getLineItem(); // Shopware\Core\Checkout\Cart\LineItem\LineItem

        $criteria = new Criteria();
        $criteria->addFilter(new EqualsFilter('id', $lineItem->getId()));
        $criteria->setLimit(1);
        
        // Hole Produkt-Datensatz zum LineItem
        $products = $this->productRepository->search($criteria, $event->getContext()); // Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult
        
        foreach ($products as $product) // $product = Shopware\Core\Content\Product\ProductEntity
        { 
            // Checke packUnit-Felder für das LineItem
            if (($product->getPackUnit() !== null) && ($product->getPackUnitPlural() !== null)){
                $packUnits = array("packUnit"=>$product->getPackUnit(), "packUnitPlural"=>$product->getPackUnitPlural());
                $lineItem->setPayloadValue("packUnits", $packUnits);
            }
        }
    }

```

Der Zugriff im HTML-Template erfolgt über `{{ nestedItem.payload.packUnits.packUnit }}` oder `{{ nestedItem.payload.packUnits.packUnitPlural }}`  
Der Zugriff im TXT-Template erfolgt bei mir über `{{ lineItem.payload.packUnits.packUnit }}` oder `{{ lineItem.payload.packUnits.packUnitPlural }}`

Beste Grüsse  
Andreas

---

<div class="post-metadata">

**Author:** ![beutelonline](https://avatars.discourse-cdn.com/v4/letter/b/b487fb/32.png) [@beutelonline](https://forum.shopware.com/u/beutelonline)\
**Post date:** [24. Mai 2023 um 12:37 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/12 "2023-05-24T12:37:22Z")

</div>

Hallo Andreas,

hast Du für diese erweiterung ein Plugin erstellt?

Gruß  
Markus

---

<div class="post-metadata">

**Author:** ![AndiMu](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/andimu/32/15941_2.png) [@AndiMu](https://forum.shopware.com/u/AndiMu)\
**Post date:** [24. Mai 2023 um 14:45 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/13 "2023-05-24T14:45:10Z")

</div>

Hallo Markus,

vielleicht hilft Dir das als Starter:

> **[GitHub - AndreasMueck/WakExtendDataForMailTemplate: WakExtendDataForMailTemplate](https://github.com/AndreasMueck/WakExtendDataForMailTemplate)**
>
> WakExtendDataForMailTemplate. Contribute to AndreasMueck/WakExtendDataForMailTemplate development by creating an account on GitHub.

Beste Grüsse  
Andreas

---

<div class="post-metadata">

**Author:** ![beutelonline](https://avatars.discourse-cdn.com/v4/letter/b/b487fb/32.png) [@beutelonline](https://forum.shopware.com/u/beutelonline)\
**Post date:** [25. Mai 2023 um 11:09 UTC](https://forum.shopware.com/t/hinzugefuegter-wert-im-cart-lineitem-payload-wird-nicht-an-e-mail-template-durchgereicht/95909/14 "2023-05-25T11:09:11Z")

</div>

Hallo Adreas,

danke schön, für das bereitstellen vom Plugin.

Grüße  
Markus
