Product-Properties in Produkt-Slider

addAssociation – wie das Englische Wort add ausdrückt – fügt eine weitere Association hinzu. Es überschreibt nichts.

Je nach Kontext erstellen die Plugins auch ihre eigene Criteria, dass diese dann voreinander getrennt sind.

Was bei dir schlief läuft, ist mir auf den ersten Blick nicht ersichtlich.

@Max_Shop so dachte ich das auch.

Nach meinen Tests liegt es auch nicht an addAssociation, sondern daran, dass bei Plugin 1 die collect-Function und die enrich-Funktion nicht mehr aufgerufen werden. getType() hingegen schon. Woran kann das liegen?

Es ist praktisch so, dass nur die collect-function des zuletzt installierten plugins aufgerufen wird.

Ich habe mir eben deinen Code angesehen…

Deine Class extended nicht die Abstract Class (nicht sicher, ob notwendig)

    foreach ($criteriaCollection as $productCriteria) {
            foreach ($productCriteria as $criteria) {
                $criteria->addAssociation('options.group');
            }
        }

Du erstellst eine $criteria Variable, verwirfst diese nach dem foreach aber wieder. Ich weiß nicht, was du dir da dann erhoffst.

Du musst die $criteria auch wieder der $criteriaCollection zuweisen.

@Max_Shop danke für die Rückmeldung.

Deine Class extended nicht die Abstract Class (nicht sicher, ob notwendig)

Hatte ich nicht gemacht, weil es in den obigen Code-Beispielen auch niemand gemacht hat… Ich habe mal extends auf extends ProductSliderCmsElementResolver eingefügt… machte aber keinen Unterschied

Du erstellst eine $criteria Variable, verwirfst diese nach dem foreach aber wieder. Ich weiß nicht, was du dir da dann erhoffst.

also quasi hiermit:
$criteriaCollection->add('product-slider' . '_' . $slot->getUniqueIdentifier(), ProductDefinition::class, $criteria);

Ich bin mir aber nicht sicher, ob das mein Problem löst… ich habe am Anfang der collect-Funktion ein dump('foobar1') eingefügt. Daher weiß ich, dass die Funktion gar nicht erst ausgeführt wird, wenn das zweite Plugin aktiv ist.

Ich brauche Kaffee… dump ist natürlich eine Symfony-Funktion (ursprüngliche Antwort war Unsinn).

extends AbstractCmsElementResolver wäre als extend vermutlich passender.

In deiner service.xml sind beide Class eingetragen?

@Max_Shop

nein dump läuft wunderbar und wird in der symfony console ausgegeben:

Wie gesagt, es funktioniert ja auch, wenn man nur eines der Plugins betrachtet… nur wenn zwei Plugins da dran wollen, wird die collect-Funktion des anderen nicht mehr ausgeführt…

1 Like

Aktualisiertes Codebeispiel:

PLUGIN 1:

<?php declare(strict_types=1);

namespace DockwareSamplePlugin\Core\Content\Product\Cms;

use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
use Shopware\Core\Content\Cms\DataResolver\Element\AbstractCmsElementResolver;
use Shopware\Core\Content\Product\Cms\ProductSliderCmsElementResolver;
use Shopware\Core\Content\Cms\DataResolver\Element\ElementDataCollection;
use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
use Shopware\Core\Content\Cms\DataResolver\CriteriaCollection;

class DockwareExtendProductSliderCmsElementResolver extends AbstractCmsElementResolver
{
    /** @var ProductSliderCmsElementResolver $elementResolver */
    private $elementResolver;

    public function __construct(ProductSliderCmsElementResolver $elementResolver)
    {
        $this->elementResolver = $elementResolver;
    }

    public function getType(): string
    {
        return $this->elementResolver->getType();
    }

    public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection
    {
        $criteriaCollection = $this->elementResolver->collect($slot, $resolverContext);

        foreach ($criteriaCollection as $productCriteria) {
            foreach ($productCriteria as $criteria) {
                $criteria->addAssociation('media');
                dump('Dockware!');
                dump($productCriteria);
            }
        }

        return $criteriaCollection;
    }

    public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
    {
        $this->elementResolver->enrich($slot, $resolverContext, $result);
    }
}

<?xml version="1.0" ?>

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

    <services>
        <service id="DockwareSamplePlugin\Core\Content\Product\Cms\DockwareExtendProductSliderCmsElementResolver">
            <argument type="service" id="Shopware\Core\Content\Product\Cms\ProductSliderCmsElementResolver"/>
            <tag name="shopware.cms.data_resolver"/>
        </service>
    </services>
</container>

PLUGIN 2:

<?php declare(strict_types=1);

namespace DockwareFooSamplePlugin\Core\Content\Product\Cms;

use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
use Shopware\Core\Content\Cms\DataResolver\Element\AbstractCmsElementResolver;
use Shopware\Core\Content\Product\Cms\ProductSliderCmsElementResolver;
use Shopware\Core\Content\Cms\DataResolver\Element\ElementDataCollection;
use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
use Shopware\Core\Content\Cms\DataResolver\CriteriaCollection;

class DockwareExtendProductSliderCmsElementResolver extends AbstractCmsElementResolver
{
    /** @var ProductSliderCmsElementResolver $elementResolver */
    private $elementResolver;

    public function __construct(ProductSliderCmsElementResolver $elementResolver)
    {
        $this->elementResolver = $elementResolver;
    }

    public function getType(): string
    {
        return $this->elementResolver->getType();
    }

    public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection
    {
        $criteriaCollection = $this->elementResolver->collect($slot, $resolverContext);

        foreach ($criteriaCollection as $productCriteria) {
            foreach ($productCriteria as $criteria) {
                $criteria->addAssociation('properties.group');
                dump('DockwareFoo!');
                dump($productCriteria);
            }
        }

        return $criteriaCollection;
    }

    public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
    {
        $this->elementResolver->enrich($slot, $resolverContext, $result);
    }
}

<?xml version="1.0" ?>

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

    <services>
        <service id="DockwareFooSamplePlugin\Core\Content\Product\Cms\DockwareExtendProductSliderCmsElementResolver">
            <argument type="service" id="Shopware\Core\Content\Product\Cms\ProductSliderCmsElementResolver"/>
            <tag name="shopware.cms.data_resolver"/>
        </service>
    </services>
</container>

Das einzige, was mir momentan noch auffällt ist, dass bei fehlt. Ich bin mir aber nicht ganz sicher, ob dies in diesem Kontext notwendig ist. Dann duften diese vermutlich gar nicht ausgeführt werden.

Ich teste es später mal per Copy&Past.

@Max_Shop

Das einzige, was mir momentan noch auffällt ist, dass bei fehlt.

Dein Satz war leider nicht ganz vollständig. Falls Du beim Copy & Past einen Fehler findest sag gern bescheid. Ich kann Dir auch einen Dropbox-Link zu den beiden Demoplugins mit dem Code schicken.

@ myshoptheme dürfte ich dich um die beiden Plugins bitten? Sitze gerade vor dem gleichen Problem. Das wär super, danke dir! :slight_smile:
LG Alex

Hallo,

dieses Plugin löst das Problem:

sg Roman

Hej, wurde der Grund gefunden, warum der Resolver des zweiten Plugins nicht collect() und enrich() ausgeführt hatte? Sitze gerade vor dem gleichen Problem und erkenne einfach den Grund nicht.


Ok, habe nun den Grund gefunden:

Die Klasse CmsSlotsDataResolver fügt (Stand 4.12.0) im __construct() alle Einträge von $resolvers in ein assoziatives Array ein. Dabei wird der string von getType des Resolvers als key genutzt und mehrere Resolver eines CMS Elements überschreiben entsprechend den Vorherigen.

Somit ist es derzeit nicht möglich mehrere Resolver zu einem Element zu nutzen. :woozy_face: