product box Variabel gibt nur manufacturerId raus - Wie komme ich an den Hersteller Namen?

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.

Oder geht das aktuell noch nicht wirklich?

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  Undecided

@opalion‍ Hast du ne Lösung? Hier hattest du ja das selbe Problem… 

 

Ich habe das gleiche Problem, bin da aber noch nicht weitergekommen. Falls also jemand die Lösung hat, wäre ich ebenfalls sehr interessiert daran…

Mit 6.3 ist das leider immer noch so…

Moin Zusammen,

das geht über ein Plugin, der Weg ist der gleiche wie https://forum.shopware.com/discussion/67641/produkt-eigenschaften-im-listing-get-article-properties-in-listing bzw. https://forum.shopware.com/discussion/64849/ausgabe-von-einzelnen-eigenschaften-in-der-kategorieuebersicht

Ihr müsst nur im Listener

$event->getCriteria()->addAssociation('manufacturer.media');

hinzufügen, dann habt ihr sowohl den manufacturer mit all seinen Daten, als auch das zugehörige Bild.

Beste Grüße,
devnullroot

 

1 „Gefällt mir“

Hi @devnullroot‍,

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  Wink

Würde mich freuen, wenn du mir etwas auf die Sprünge helfen könntest! Danke  Smile

Habe es nun zum laufen bekommen. Scheinbar war irgendwo noch ein Typo drin. Nach dem neu anlegen läuft alles  Smile

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?

1 „Gefällt mir“

Moin Zusammen,

schön, dass es bei euch auch funktioniert und danke @finsti‍ für den Hinweis für die Suche!

Die Product-Boxen können nicht per Subscriber angereichert werden, die Implementierung läuft hier über Resolver. Ich habe meinen aktuellen Stand hier geposted: https://forum.shopware.com/discussion/71560/product-properties-in-produkt-slider/#Comment_279767

Hoffe, es hilft!

Beste Grüße,
devnullroot

Hi @devnullroot‍,

1.000 Dank für die weitere Hilfe!

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.

Viele Grüße
finsti

Moin @finsti,

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.

Beste Grüße,
devnullroot

1 „Gefällt mir“

Besten Dank, @devnullroot‍!
Jetzt habe ich den Hersteller überall da, wo ich ihn brauche. Smile

Hallo @finsti‍,

danke erstmal für den Hinweis mit dem ProductSearchCriteriaEvent Subscriber. Habe ich eingebaut  Smile

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.

Danke und viele Grüße!

Moin @halabalusa‍,

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.

 

Beste Grüße,
devnullroot

Moin @devnullroot‍,

klar. Meine services.xml sieht aktuell so aus:

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.

Viele Grüße!

Moin @halabalusa‍ ,

Du hast da eine klassische Klassennamen/Namspace-Kollision. Du musst auf jeden Fall ein use-Statement hinzufügen:

use Shopware\Core\Content\Product\Cms\ProductSliderCmsElementResolver;

Falls das nicht reicht, musst Du im Constructor auch noch mal den ganzen Pfad mit angeben. Oder Du nennst deine Klasse um.

Das sollte alles sein :slight_smile:

 

Beste Grüße,
devnullroot

1 „Gefällt mir“

Moin @devnullroot‍,

super, vielen Dank! Das war genau das was ich gebraucht habe Smile Nun habe ich auch überall die Daten, die ich brauche. Top  Smile 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:

  1. 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’);

     if (!$productConfig || $productConfig->isMapped() || $productConfig->getValue() === null) {
       return null;
     }
    
     $criteria = new Criteria([$productConfig->getValue()]);
    
     $criteriaCollection = new CriteriaCollection();
     $criteria->addAssociation('manufacturer');
     $criteria->addAssociation('manufacturer.media');
     $criteriaCollection->add('product_' . $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);
    }
    }

  2. Resolver für die Produktslider anlegen unter src/Resolver/HalabalusaProductSlider.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();
     $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('manufacturer');
       $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);
    }
    }

  3. 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’);
    }
    }

  4. 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’);
    }
    }

  5. 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

@halabalusa @devnullroot habt Ihr eine Lösung für die dynamischen Produktgruppen gefunden? Das ganze funktioniert bei mir nur mit fixen Slidern.

{{ page.product.manufacturer.media }}
{{ page.product.manufacturer.translared.name }}