Erweiterung der SalesChannelEntity

Hallo, ich entwickele ein Plugin, das unter anderem die SalesChannelEntity extended.

    public function extendFields(FieldCollection $collection): void
{
    $collection->add((new ManyToManyAssociationField(
        'warehouses',
        WarehouseDefinition::class,
        WarehouseSaleschannelDefinition::class,
        'sales_channel_id',
        'warehouse_id'
    ))->addFlags(new Inherited())
    );
}

Das funktioniert so weit auch, in einem neuen Adminmodul kann ich die Zuweisungen von SalesChannel zu Warehouse vornehmen. Die WarehouseEntity stammt auch aus meinem Plugin.

Allerdings komme ich im Frontend nicht an die dem SalesChannel zugeordneten Warehouses dran. Beim Dump wird nichts ausgegeben, die Bespiele zum Erweitern von Entities zielen alle auf die Erwiterung von ProductEntity ab, das hilft mir nicht weiter.

Ich möchte a) dass die betroffenen warehouses erstmal im dump() auftauchen und b) natürlich dann im Template (und später vielleicht auch via PHP) auf diese neue Assoziation zugreifen. Wie geht das? Ich komme hier einfach nicht weiter.

Danke für Tipps
Martin

Hi,
du benötigst einen Subscriber der auf ein Event hört was von Shopware geworfen wird.

Hier ist ein Beispiel z.B. für die Produktdetailseite, wo wir unser Criteria erweitern um die Relation aufzulösen:

<?php

namespace My\Plugin\Storefront\Page\Product\Subscriber;

use Shopware\Storefront\Page\Product\ProductPageCriteriaEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ProductPageCriteriaSubscriber implements EventSubscriberInterface
{
    /**
     * @inheritDoc
     */
    public static function getSubscribedEvents()
    {
        return [
            ProductPageCriteriaEvent::class => 'onProductPageCriteria'
        ];
    }

    /**
     * @param ProductPageCriteriaEvent $event
     */
    public function onProductPageCriteria(ProductPageCriteriaEvent $event): void
    {
        $event->getCriteria()->addAssociation('MY_RELATION');
    }
}

Das ganze musst du dann in der services.xml folgendermaßen registrieren:

        <service id="My\Plugin\Storefront\Page\Product\Subscriber\ProductPageCriteriaSubscriber">
        <tag name="kernel.event_subscriber"/>
    </service>

Wird z.B. auch hier erklärt Shopware 6: Add data to a storefront page

1 „Gefällt mir“

Hallo, danke für den Tipp. Ich bräuchte wohl für die StoreFrontEntity das passende Event, dass du für die Produkterweiterung nutzt. Aber da finde ich partout nichts. Deshalb benutze ich momentan einen EventListener, der auf SalesChannelEvents::SALES_CHANNEL_LOADED hört, allerdings weiß ich nicht, wie ich an dieser späten Stelle mein Objekt noch erweitern kann.

Ich würde meine Warehouses zur Not aus dem Warehouserepository holen und der StoreFront als Extension hinzufügen, bekomme das aber auch irgendwie nicht hin, denn dort muss ich als Association die SalesChannels hinzufügen, was zu einer endlosschleide führt, da dann wieder der EventSubscriber greift und ich wieder anfange, die Warehouses zu laden etc. pp.

Okay, also danke noch mal :slight_smile: Mir ist inzwischen klargeworden, dass ich das Storefront-Objekt auch an anderer Stelle (bei anderen Events) erweitern kann.

1 „Gefällt mir“