In der Produkt Box gibt mit product nur die manufacturerId raus, anscheinend wird doch nicht der Hersteller Name mit ausgegeben. Wie genau kann ich an den Herstellernamen kommen?
manufacturer gibt nur null aus, Hersteller ist allerdings hinterlegt.
Hast du mittlerweile eine Lösung finden können? In der 6.2. komme ich weiterhin nur an die {{ product.manufacturerId }} ran, will aber eigentlich das Image haben
@opalion Hast du ne Lösung? Hier hattest du ja das selbe Problem…
danke für die Links und den Hinweis! Ich komm allerdings noch nicht ganz zum Ziel damit. Hab aber bisher leider auch noch keine Erfahrung mit sw6 Plugins und vermutlich übersehe ich etwas. Kannst du einmal schauen, was bei mir fehlt? Mein Vorgehen:
Ich erstelle erst ein Base-Plugin über die console:
bin/console plugin:create SupplierInfoListing
Anschließend lege ich einen Subscriber an im Plugin: /src/Storefront/Product/Listing/Subscriber/ListingSubscriber.php
'handleListingRequest',
];
}
public function handleListingRequest(ProductListingCriteriaEvent $event): void
{
$event->getCriteria()->addAssociation('manufacturer.media');
}
}
Den Subscriber definiere ich dann in in der services.xml
Dann natürlich Plugin installieren + aktivieren. Wenn ich nun in der Product Box im Listing ein {{ dump() }} ausführe, dann komme ich nicht an die Hersteller-Infos. Mit properties aus den anderen Threads komme ich auch nicht auf die vergebenen Eigenschaften. Daher scheint ja noch irgendwas im Plugin zu fehlen
Würde mich freuen, wenn du mir etwas auf die Sprünge helfen könntest! Danke
Vielen Dank für die Tipps hier, @halabalusa! So habe ich es auch endlich geschafft, mir im Listing den Herstellernamen mit auszugeben. Allerdings habe ich bemerkt, dass der beschriebene Weg z.B. bei Listings von Suchergebnissen oder bei der Verwendung von Produktboxen in den Einkaufswelten nicht greift.
Im Fall der Suchergebnisse konnte ich einfach noch einen Subscriber für das ProductSearchCriteriaEvent hinzufügen, allerdings finde ich nicht das richtige Event für die Produktboxen in den Einkaufswelten. Weiß jemand Rat?
Ich konnte dein Beispiel mit dem Product Slider in meinem Plugin erfolgreich nachbauen. Leider ist es mir aber nicht gelungen, das analog für die Product Boxes zu implementieren. Ich wäre dir daher wirklich sehr dankbar, wenn du den konkreten Code posten könntest, wie der Resolver für die Product Boxes aussehen müsste, damit dort auf den Manufacturer Name zugegriffen werden kann.
ich hab das falsch formuliert, die Product-Boxen habe ich noch gar nicht implementiert, bisher nur den Slider. Es müsste aber eigentlich genauso gehen wie dort. Du brauchst eigentlich nur ProductSliderCmsElementResolver durch ProductBoxCmsElementResolver ersetzen. Die collect Methode müsstest Du dementsprechend aus der ProductBoxCmsElementResolver->collect kopieren und da wie gewohnt $criteria=>addAssociation("manufacturer.media"); hinzufügen. Wenn bei dir die Daten im Slider ankommen, sollt es dann automatisch auch in den Boxen gehen.
danke erstmal für den Hinweis mit dem ProductSearchCriteriaEvent Subscriber. Habe ich eingebaut
Allerdings harkt es bei mir noch mit dem Resolver. Ich habe versucht den Code von @devnullroot aus https://forum.shopware.com/discussion/comment/279767/#Comment_279767 einzubauen, aber ich bekomme einen TypeError (__construct() must be an instance of Plugin\Resolver\MyResolver).
Magst du hier einmal deinen Code für die Product Boxes reinstellen? Würde mir super weiterhelfen, gerade stehe ich auf dem Schlauch.
magst Du mal deine services.xml und Resolver-Klasse posten? Bei mir läuft es (bis auf die Dummy-Namen natürlich) genau so wie in meinem Post. Du müsstest eigentlich nur überall ProductSliderCmsElementResolver durch ProductBoxCmsElementResolver ersetzen.
Mein Resolver ist 1:1 von dir kopiert, ich habe nur den namespace angegeben und meine Klasse anders benannt:
elementResolver = $elementResolver;
}
public function getType(): string
{
return $this->elementResolver->getType();
}
public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection
{
$criteriaCollection = new CriteriaCollection();
$config = $slot->getFieldConfig();
$products = $config->get('products');
if (!$products || $products->isMapped() || $products->getValue() === null) {
return null;
}
if ($products->isStatic() && $products->getValue()) {
$criteria = new Criteria($products->getValue());
$criteria->addAssociation('properties.group');
$criteria->addAssociation('manufacturer.media');
$criteriaCollection->add('product-slider' . '_' . $slot->getUniqueIdentifier(), ProductDefinition::class, $criteria);
}
return $criteriaCollection->all() ? $criteriaCollection : null;
}
public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
{
$this->elementResolver->enrich($slot, $resolverContext, $result);
}
}
Damit bekomme ich einen 500er in Zeile 12 der Resolver Klasse mit dem Fehler:
Argument 1 passed to Halabalusa\Resolver\ProductSliderCmsElementResolver::__construct() must be an instance of Halabalusa\Resolver\ProductSliderCmsElementResolver, instance of Shopware\Core\Content\Product\Cms\ProductSliderCmsElementResolver given, called in …
Mein Plan war eigentlich, dass ich erst einmal deinen Code zum laufe bekomme und ihn dann an meine Bedürfnisse anpasse.
super, vielen Dank! Das war genau das was ich gebraucht habe Nun habe ich auch überall die Daten, die ich brauche. Top Du hattest in beiden Fällen recht. Es fehlten die use-Statements und die Klasse war so natürlich auch doof benannt…
Falls noch jeman anderes das benötigt, hier einmal der komplette Code um die Hersteller-Daten im Lisitng und im CMS nutzen zu können:
Resolver für die Produktboxen anlegen unter src/Resolver/HalabalusaProductBox.php
elementResolver = $elementResolver;
}
public function getType(): string
{
return $this->elementResolver->getType();
}
public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection
{
$criteriaCollection = new CriteriaCollection();
$config = $slot->getFieldConfig();
$productConfig = $config->get(‘product’);
public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
{
$this->elementResolver->enrich($slot, $resolverContext, $result);
}
}
Subscriber für das Listing anlegen unter src/Subscriber/HalabalusaManufacturerListing.php
‘handleListingRequest’
];
}
public function handleListingRequest(ProductListingCriteriaEvent $event): void
{
$event->getCriteria()->addAssociation(‘manufacturer’);
$event->getCriteria()->addAssociation(‘manufacturer.media’);
}
}
Subscriber für die Suche anlegen unter src/Subscriber/HalabalusaManufacturerSearch.php
‘handleListingRequest’
];
}
public function handleListingRequest(ProductSearchCriteriaEvent $event): void
{
$event->getCriteria()->addAssociation(‘manufacturer’);
$event->getCriteria()->addAssociation(‘manufacturer.media’);
}
}
alles in der service.xml eintragen
Dann kann anschließend über z.B. {{product.manufacturer.translated.name}} oder z.B. {{product.manufacturer.media|sw_encode_media_url}} auf die Daten zugegriffen werden.
@halabalusa Sehr cool, danke für das Auflisten der Code-Schnipsel.
Ich habe aktuell das gleiche Problem und will auf die Hersteller-Daten in den Slidern zugreifen. Habe ein passendens Plugin generiert und erstmal nur die HalabalusaProductSlider.php-Klasse erstellt und per service.xml registriert (mit entprechenden Umbennenungen der Namespaces etc)
Komischerweise rennt das Frontend damit dann in eine „ERR_TOO_MANY_REDIRECTS“-Fehlermeldung überall auf den Seiten, wo ein Slider benutzt wurde. Hat jemand von euch eine Idee, was das sein könnte? Bin aktuell auf Shopware 6.3.5.1