Shopware Plugin Event Produkt Feed Export

Hallo zusammen,

ich bin gerade dabei eine Plugin zu erstellen, welches mir neue Variablen im Produkt-Export Feed zur Verfügung stellt. Ich habe aktuell einen neuen Subscriber erstellt und diesen auch in der services.xml registriert. Aber das Plugin hört nicht auf dieses Event. Andere Events funktionieren

src/Subscriber/ProductFeedExportSubscriber.php

<?php

namespace uniqueweb\AdvancedProductFeedExport\Subscriber;

use Shopware\Core\Content\ProductExport\Event\ProductExportRenderBodyContextEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ProductFeedExportSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            ProductExportRenderBodyContextEvent::NAME => 'onRenderBodyContextEvent'
        ];
    }

    public function onRenderBodyContextEvent(ProductExportRenderBodyContextEvent $event): array
    {
        $context = $event->getContext();
        $context['property_groups'] = 'test groups';

        return $context;
    }
}

src/Resources/config/services.xml

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="https://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="uniqueweb\AdvancedProductFeedExport\Subscriber\ProductFeedExportSubscriber">
            <tag name="kernel.event_subscriber"/>
        </service>
    </services>
</container>

shopware/core/Content/ProductExport/Event/ProductExportRenderBodyContextEvent.php

<?php declare(strict_types=1);

namespace Shopware\Core\Content\ProductExport\Event;

use Symfony\Contracts\EventDispatcher\Event;

class ProductExportRenderBodyContextEvent extends Event
{
    public const NAME = 'product_export.render.body_context';

    /**
     * @var array
     */
    private $context;

    public function __construct(array $context)
    {
        $this->context = $context;
    }

    public function getContext(): array
    {
        return $this->context;
    }

    public function setContext(array $context): void
    {
        $this->context = $context;
    }
}

Dieses Event (product_export.render.body_context) wird in folgendem Service gefeuert: shopware/core/Content/ProductExport/Service/ProductExportGenerator.php:177

$productContext = $this->eventDispatcher->dispatch(
            new ProductExportRenderBodyContextEvent(
                [
                    'productExport' => $productExport,
                    'context' => $context,
                ]
            )
        );

        $body = '';
        while ($productResult = $iterator->fetch()) {
            /** @var ProductEntity $product */
            foreach ($productResult->getEntities() as $product) {
                $data = $productContext->getContext();
                $data['product'] = $product;

                if ($productExport->isIncludeVariants() && !$product->getParentId() && $product->getChildCount() > 0) {
                    continue; // Skip main product if variants are included
                }
                if (!$productExport->isIncludeVariants() && $product->getParentId()) {
                    continue; // Skip variants unless they are included
                }

                $body .= $this->productExportRender->renderBody($productExport, $context, $data);
            }

            if ($exportBehavior->batchMode()) {
                break;
            }
        }

Wenn ich in meinem Sale-Channel vom Typ „Produktvergleich“ in den Tab „Template“ Wechsel, davor Breakpoints in der ProductExportGenerator setze davor und danach und anschließend unten auf Preview klicke hält der Xdebug genau an diesen Breakpoints an und läuft auch über die Zeilen drüber, indem das Event gefeuert wird. Allerdings geht Shopware nicht in meinen Subscriber rein, welcher genau auf dieses Event hört.

Hat hier jemand eine Idee? Hintergrund ist, dass ich gerne $data erweitern würde um zusätzliche Werte, welche in den Export ausgegeben werden sollen.

Vielen Dank schonmal für eure Hilfe.

Verwende bei deinem Subscriber ProductExportRenderBodyContextEvent::class.

Die Konstante NAME wird beim Werfen des Events nicht verwendet. Daher wird hier der Klassenname als Eventname verwendet.

@abdullah Vielen lieben Dank. Genau das war das Problem.