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.
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.
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…
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.
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.
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.
komischerweise wird von heute auf auf morgen die enrich und collect Funktion meines Resolvers nicht mehr aufgerufen. Der manufacturer im Product Slider ist jetzt leer. Konstruktor wird aufgerufen, aber in enrich und collect geht er erst gar nicht rein.
Woran kann das liegen?
Mein Resolver:
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 ExtendProductSliderCmsElementResolver extends AbstractCmsElementResolver
{
/** @var ProductSliderCmsElementResolver $elementResolver */
private $elementResolver;
public function __construct(ProductSliderCmsElementResolver $elementResolver)
{
$this->elementResolver = $elementResolver;
}
public function getType(): string
{
return 'extended-product-slider-cms-element-resolver';
}
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');
$criteria->addAssociation('manufacturer');
}
}
return $criteriaCollection;
}
public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
{
$this->elementResolver->enrich($slot, $resolverContext, $result);
}
}
Error log nicht verdächtig, Shopware Updates ja in letzter Zeit, Plugin Updates auch ja, genauso PHP Update vom Server. Habe es aber vorhin auf meiner 0815 Docker Installation lokal probiert, da funktioniert es auch nicht mehr Auf der lokalen Installation laufen keine Plugins und noch SW 6.4.14.0. und PHP 8.0, sollte also funktionieren…
Edit: Lokal funktioniert es jetzt doch, das heißt irgendwo auf meiner Produktionsumgebung ist der Wurm drinnen
Haha danke dir! Das Hilft mir schon sehr viel. Es werkelt scheinbar gerade eine Entwicklerbude an einem ihrer Plugins in der Live Umgebung herum, somit wird das Problem vermutlich irgendwo von ihnen verursacht. Kann leider aktuell keine Plugins deaktivieren, da ich ihnen vermutlich sonst ins Handwerk pfusche
Ich bin jetzt weitergekommen. Der Pluginhersteller hatte auch einen Resolver für den CMS Product Slider und scheinbar hat dieser meinen Resolver einfach überschrieben.
Habe mir angeschaut, wie sie das gecoded haben und mir bisschen was abgeschaut. Scheinbar war meine Variante nicht sauber und nachhaltig.
Sie haben nicht den ProductSliderCmsResolver übergeben sondern das CmsElementResolverInterface. Zusätzlich haben sie noch den Service etwas anders in der service.xml registriert. Unten der Auszug aus meinem abgeänderen Code, wie es funktioniert.
use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
use Shopware\Core\Content\Cms\DataResolver\Element\CmsElementResolverInterface;
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 ExtendProductSliderCmsElementResolver extends ProductSliderCmsElementResolver
{
/**
* @var ProductSliderCmsElementResolver
*/
private $parent;
public function __construct(CmsElementResolverInterface $parent)
{
$this->parent = $parent;
}
public function getType(): string
{
return 'product-slider';
}
public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection
{
$criteriaCollection = $this->parent->collect($slot, $resolverContext);
foreach ($criteriaCollection as $productCriteria) {
foreach ($productCriteria as $criteria) {
$criteria->addAssociation('properties.group');
$criteria->addAssociation('manufacturer');
}
}
return $criteriaCollection;
}
public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
{
$this->parent->enrich($slot, $resolverContext, $result);
}
}