Shopping Experience - Product Box gibt nur ManufacturerId mit

Servus Leute,

Ich hab ein Problem mit Shopware, ich verwende die Shopping Experience von Shopware, um die Produkte einfacher auf meiner Shop-Homepage anzuzeigen. Nur ein Problem ist, dass die Product Cards ziemlich dumm ausschauen, weil die manufacturer Namen nicht angezeigt werden.

So sollten die Product-Cards ausschauen:
image

Derzeit wird der Name, aber nicht angezeigt…

Ich hab schon in anderen Posts gesehen, dass das evtl. mit Resolvern gehen könnte [siehe hier]. Ich habe das implementiert, aber es hat nicht funktioniert, die manufacturer Variable ist noch immer null…

1 Like

Der Herstellername ist mit ziemlicher Sicherheit im dump verfügbar. Du müsstest ihn einfach per twig einblenden lassen. Da ist kein Resolver nötig. Sollte er nicht verfügbar sein, per Subscriber nachladen.

1 Like

Ey danke für die Antwort, aber nein der Name wird nicht geladen.

Schau hier:

Wie würde ich das mittels Subscriber machen? Bin noch ein Anfänger, wenn es um Shopware geht :sweat_smile:

Ich hatte ein Schreibfehler in meiner Antwort.

Entweder über den Resolver nachladen oder per Subscriber.

public static function getSubscribedEvents(): array
{
// Return the events to listen to as array like this: =>
return [
ProductListingCriteriaEvent::class => ‚onProductListingCriteriaEvent‘,
];
}

public function onProductListingCriteriaEvent(ProductListingCriteriaEvent $event)
{
    $event->getCriteria()->addAssociation('manufacturer');
}

Ist copy & past. Musst du auf dein Szenario anpassen.

1 Like

Danke nochmal für den Ansatz, aber was muss ich danach machen. Das Tutorial ist etwas mager…, wenn du weißt was ich meine.

Daweil hab ich das hier.

<?php
declare(strict_types=1);

namespace VinoshopTheme\Storefront\Subscriber;

use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;

class HomepageSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        // Return the events to listen to as array like this:  <event to listen to> => <method to execute>
        return [
            ProductListingCriteriaEvent::class => 'onProductListingCriteriaEvent'
        ];
    }

    public function onProductListingCriteriaEvent(ProductListingCriteriaEvent $event)
    {
        // Do something
        // E.g. work with the loaded entities: $event->getEntities()
        $event->getCriteria()->addAssociation('manufacturer');
    }
}```

    <service id="VinoshopTheme\Storefront\Subscriber\HomepageSubscriber">
        <tag name="kernel.event_subscriber"/>
    </service>

Ich glaube, dass ich mittels productId den Manufacturer besorgen kann bzw. muss. Leider hab ich keinen Plan, wie ich das machen soll.
Muss man das evtl. mithilfe von EnitityRepositories machen?

Mit diesem Subscriber wird jedes Mal, wenn das ProductListingCriteriaEvent eintritt (sprich im Listing/Kategorien) der Manufacturer mit geladen. Dieser ist dann im dump (twig) verfügbar.

Du wirst vermutlich aber die Daten nicht im Listing benötigen, sondern auf einer anderen Seite. Entsprechend musst du ein anderes Event suchen. Im Dev Modus, unten in der Symfony Bar siehst du alle Events, die bei einem Seitenaufruf aktiviert wurden.

Mit EnitityRepositories musst du nichts machen. Das macht alles Symfony für dich durch $event->getCriteria()->addAssociation(‚manufacturer‘);

2 Likes

Ich habe jetzt es versucht zu machen bzw. das richtige Event zu finden. Ich hab’s noch immer nicht hinbekommen. Ich finde das richtige Event einfach nicht. Es müsste ein Event sein, dass die Produkte von der Shopping Experience loaded, aber so eines finde ich nicht.

Shopware\Core\Framework\DataAbstractionLayer\Event\EntitySearchedEvent ist das einzige Event, dass gecalled wurde und was mit entities zu tun hat, aber das hat auch nicht funktioniert… :expressionless: :expressionless:

Nutzt du die Suche oder ist dass das normale Listing oder eine Shopseite?

Also es ist eine Landing Page (Shopping Experience).

und hast du schon einen Plan?

Ich müsste es selbst programmieren, aus dem Kopf ist das zu komplex. Leider keine Zeit dafür.

Ah ok, trotzdem danke! :slight_smile:

Falls wer die Lösung braucht, ich habs so hinbekommen:

  1. Service erstellen
    • Pfad = Storefront\Service\AddManufacturerToHomePage.php
<?php
declare(strict_types=1);

namespace VinoshopTheme\Storefront\Service;

use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Aggregation\Metric\CountAggregation;
use Shopware\Core\Framework\DataAbstractionLayer\Search\AggregationResult\Metric\CountResult;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\Content\Product\ProductEvents;
use Shopware\Storefront\Page\LandingPage\LandingPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\Struct\ArrayEntity;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Storefront\Event\StorefrontRenderEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntitySearchedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;

class AddManufacturerToHomePageProducts implements EventSubscriberInterface
{
    /**
     * @var SalesChannelRepositoryInterface
     */
    private $productRepository;
    /**
     * @var EntityRepository
     */
    private $manufacturerRepository;

    public function __construct(SalesChannelRepositoryInterface $productRepository, EntityRepository $manufacturerRepository)
    {
        $this->productRepository = $productRepository;
        $this->manufacturerRepository = $manufacturerRepository;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            ProductEvents::PRODUCT_LOADED_EVENT => 'onProductsLoaded'
        ];
    }

    public function onProductsLoaded(EntityLoadedEvent $event)
    {
    
        foreach($event->getEntities() as $entity) {
            if ($entity->getManufacturerId() == null)
                continue;

            $criteria = new Criteria([$entity->getManufacturerId()]);

            /** @var ProductManufacturerEntity $currentManufacturer */
            $currentManufacturer = $this->manufacturerRepository
                ->search($criteria, $event->getContext())
                ->get($entity->getManufacturerId());

            if ($currentManufacturer != null)
            {
                $entity->setManufacturer($currentManufacturer);
            }
        }
    }

}

Der Code ist noch nicht optimiert, weil hier der ganze Manufacturer geliefert wird, aber auf der Homepage wird nur der Winzername (zumindest bei mir) benötigt.

  1. AddManufacturerToHomePage.php als Service registrieren
<service id="[PluginName]\Storefront\Service\AddManufacturerToHomePageProducts">
            <argument type="service" id="sales_channel.product.repository"/>
            <argument type="service" id="product_manufacturer.repository"/>
            <tag name="kernel.event_subscriber"/>
</service>

Das wars.

Ich hoffe, dass ich jmd damit helfen konnte.

2 Likes