Manufacturer Repository durchsuchen über Name

Hallo,

ich schreibe gerade ein eigenes Manufacturer Plugin. Die Detailseite/Listing Seite soll über eine schönere Url abrufbar sein, zB /brand/{brandname} statt wie bei den meisten Plugins über einen query string mit der manufacturer ID,.

„brandname“ wird der manufacturer name in lowercase sein, also /brand/adidas. Wie durchsuche ich das manufacturer repository, wenn ich nur den kleingeschriebenen Namen des Herstellers habe und nicht die Id ?

Quasi so etwas wie:
$criteria->addFilter(new EqualsFilter(strtolower('manufacturer_name), $brandname);

LG Alex

Abgesehen davon, dass du mit dieser Methode mit Sonderzeichen so deine Probleme bekommen wirst, die URLS nicht in der Sitemap auftauchen und … das criteria sieht doch korrekt aus.

Mit Filtern kann man nach allem suchen, nicht nur nach ids. Daher ist dein strtolower-Ansatz nicht falsch.
Ob es nun manufacturer_name heißt oder dafür auch eine translation gibt, bzw. die überhaupt notwendig ist… ein Blick in die Datenbank sollte das recht schnell klären.

Danke für deine Antwort. Mein Filter war nur ins Blaue geraten. Ich habe ein paar Filterbeispiele gesehen mit ‚manufacturerId‘, kann mir aber nicht erklären, woher das genau kommt, da es keine Felde in der Datenbanktabellen gibt, das so heißen. Hast du da einen Tipp, wie ich am besten an die korrekte Bezeichnung komme?

Meinst du macht es grundsätzlich mehr Sinn das klassisch über die ID zu lösen statt über den Namen? Dachte mir, so ist die URL leserlicher.

Lg Alex

Wenn der Hersteller nicht automatisch geladen wird, dann müsstest du per $criteria->addAssociation(‚manufacturer‘) den Hersteller nachladen lassen. Hersteller wird wie nahezu jedes andere Entity auch eine translation haben.

Im Equals wird es dann vermutlich manufacturer.name oder manufacturer.translated.name lauten.

Nein, SEO-URLs sind immer sinnvoll. Nur bei URLs muss man auf Sonderzeichen etc. aufpassen. Ein Leerzeichen, ä, ö,ü,ß usw. in der URL macht sich bspw. nicht gut.

product_manufacturer.name war das korrekte Feld und so funktioniert es auch.

$criteria->addFilter(new EqualsFilter(strtolower('product_manufacturer.name'), $name));

EDIT: Leider bekomme ich es nicht hin, das strtolower bzw. mein neues str_replace(’ ', ‚-‘, …) mit in den Vergleich einzubeziehen. Ich bekomme über die Route dann so etwas wie /brand/firma-1-ag und in der DB steht dann Firma 1 AG.

Probiert habe ich
$criteria->addFilter(new EqualsFilter(strtolower(str_replace(' ', '-',' 'product_manufacturer.name')), $name));

Eine Idee wie ich das korrekt einbaue?

Das ist das Problem, was ich in meinem ersten Post angedeutet habe. Ich würde für alle Hersteller ein Slug erstellen lassen. Dann kannst du das Feld abfragen, Seo-Routen in der Sitemap erstellen usw.

Der beste weg ist, SEO Urls für den Controller erstellen zu lassen, und ID als Identifier in der Route zu lassen, so wie bei den Artikeln etc. auch.


    /**
     * @Since("6.0.0.0")
     * @HttpCache()
     * @Route("/marke/{manufacturerId}", name="frontend.marke.page", options={"seo"="true"}, methods={"GET"})
     */
    public function index(?string $manufacturerId, SalesChannelContext $salesChannelContext, Request $request): Response
    {

Habe ich auch so gemacht für unsere Brand-Pages und funktioniert einwandfrei.

Die Doku ist irgendwie komplizierter als es eigentlich ist.

So werde ichs auch machen, danke dir