Hallo zusammen,
ich versuche seit mehreren Tagen das Artikelgewicht in der Rechnung darzustellen. Die mir bekannten Variablen funktionieren leider nicht mehr.
Haben sich diese geändert?
Zudem würde ich gerne noch Zusatzfelder ausgeben. Vielleicht kann hier jemand helfen.
wenn du in deinem eigenen Theme ein Dokumententemplate angelegt hast, kannst du über
{{ lineItem|json_encode(constant(‚JSON_PRETTY_PRINT‘)) }}
die verfügbaren Variablen anzeigen lassen.
Zusatzfelder kannst du mit {{ lineItem.payload.customFields.NAME_DES_ZUSATZFELDES }} ausgeben.
Das Gewicht steht im Standard in der Rechnung nicht zur Verfügung.
Über ein kleines Plugin kannst du das Gewicht dem Payload hinzufügen.
Dafür ein Subscriber anlegen und die service.xml nicht vergessen
use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class LineItemSubscriber implements EventSubscriberInterface
{
private $productRepository;
private $requestStack;
public function __construct(EntityRepository $productRepository, RequestStack $requestStack) {
$this->productRepository = $productRepository;
$this->requestStack = $requestStack;
}
public static function getSubscribedEvents()
{
return [
BeforeLineItemAddedEvent::class => 'beforeLineItemAdded',
];
}
/**
* @param BeforeLineItemAddedEvent $event
* @throws \Shopware\Core\Checkout\Cart\Exception\InvalidPayloadException
*/
public function beforeLineItemAdded(BeforeLineItemAddedEvent $event)
{
$lineItem = $event->getLineItem();
if ($lineItem->getType() == "product") {
foreach ($this->requestStack->getCurrentRequest()->get('lineItems') as $key => $item) {
if ($lineItem->getId() == $key) {
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $lineItem->getId()));
$product = $this->productRepository->search($criteria, Context::createDefaultContext())->first();
$lineItem->setPayloadValue('weight', $product->getWeight());
}
}
}
}
}
spitze! Vielen Dank, das hat mir noch gefehlt. Wobei ich diese beiden Variablen schon mal hatte. Als Hinweis für alle: Wenn man die Felder testen möchte, reicht es nicht vorhandene Bestellungen mit entsprechenden Positionen sich generieren zu lassen.
Man muss eine komplett neue Bestellung auslösen, dann sind auch die Zusatzfelder zu sehen.
Musste vor der foreach-Schleife noch diese Zeile ergänzen, sonst kommt es beim Checkout zu einem 500er, weil die Schleife vermutlich mit dem falschen Argument aufgerufen wird (Array, Objekt), das Argument ist aber vom Typ NULL.
Jetzt wird zunächst überprüft, ob $lineItems nicht null ist und ob es ein Array ist, bevor es die foreach -Schleife durchläuft.