ModelReposity - Order- Funktion manipulieren

Guten Morgen, ich will die Funktion filterListQuery() in https://github.com/ShopwareAG/shopware- … sitory.php erweitern. Ich brauche bei der Filterung einen zusätzlichen Wert (Kundennummer): [quote] $expr->like(‘billing.number’, ‘?3’), [/quote] Hat hier schon mal jemand was geändert oder hat mir einen Tipp? Mit dem Querybuilder habe ich mich bis jetzt noch nicht so beschäft und ich finde auch keine Einstiegshilfe. Danke

Hier ein wenig Lektüre zur Theorie: http://wiki.shopware.de/Shopware-4-Quer … _1076.html http://wiki.shopware.de/Selektierung-vo … l_879.html Ein paar praktische Beispiele zur Nutzung: http://wiki.shopware.de/Einsteiger-Schu … 2_871.html http://wiki.shopware.de/Fortgeschritten … _1028.html Und immer wieder eine gute Anlaufstelle bei offenen Fragen: http://docs.doctrine-project.org/projec … ilder.html Falls du konkrete Fragen hast, dann kannst du die gerne stellen und ich werde mein bestes versuchen zu helfen :slight_smile: Viele Grüße

1 „Gefällt mir“

Danke für dene Links. Die haben mir schon sehr weitergeholfen. Nun bin ich mir aber noch nicht ganz sicher, ob der Weg wie ich es nun machen will korrekt ist. Ich dachte nun, ich hooke die Methode und hole mir den fertigen Builder. Also replace. Nun hat dieser ja schon die andWhere Angaben im Original erstellt. $builder-\>andWhere( $expr-\>orX( $expr-\>like('orders.number', '?1'), $expr-\>like('orders.invoiceAmount', '?1'), $expr-\>like('orders.transactionId', '?1'), $expr-\>like('payment.description', '?1'), $expr-\>like('dispatch.name', '?1'), $expr-\>like('orderStatus.description', '?1'), $expr-\>like('paymentStatus.description', '?1'), $expr-\>like('orders.orderTime', '?2'), $expr-\>like('billing.company', '?3'), $expr-\>like('billing.lastName', '?3'), $expr-\>like('billing.firstName', '?3'), $expr-\>like('shop.name', '?3'), $expr-\>like('orders.comment', '?3'), $expr-\>like('orders.customerComment', '?3'), $expr-\>like('orders.internalComment', '?3') ) ); Wenn ich nun erneut andWhere mache, so habe ich es ja doppelt, oder wird das überschrieben? Andernfalls muss ich es über replace machen und die ganze Methode überschreiben. Diese Mögichkeit wird sicher auf jeden Fall gehen. Was meinst du? Ist es über :after realisierbar? P.S. ich will hier kein fertigen Code, sondern nur über Best Practice sprechen :wink: Danke dir

HI, also mit after komme ich nicht weiter. Ich will nun das ganze Replace, komme aber nicht an den Builder ran: $this-\>subscribeEvent( 'Shopware\Models\Order\Repository::filterListQuery::replace', 'afterfilterListQueryReplace' ); /\*\* \* Hooks the filterList method of the order repository. \* Manipulate Filter \* \* @param Enlight\_Hook\_HookArgs $arguments \*/ public function afterfilterListQueryReplace(Enlight\_Hook\_HookArgs $arguments) { $builder = $arguments-\>getBuilder(); $filters = $arguments-\>getFilters(); //$builder = $arguments-\>get('builder'); //$filters = $arguments-\>get('filters'); $expr = Shopware()-\>Models()-\>getExpressionBuilder(); if (!empty($filters)) { foreach ($filters as $filter) { if (empty($filter['property']) || $filter['value'] === null || $filter['value'] === '') { continue; } switch ($filter['property']) { case "free": $builder-\>andWhere( $expr-\>orX( $expr-\>like('orders.number', '?1'), $expr-\>like('orders.invoiceAmount', '?1'), $expr-\>like('orders.transactionId', '?1'), $expr-\>like('payment.description', '?1'), $expr-\>like('dispatch.name', '?1'), $expr-\>like('orderStatus.description', '?1'), $expr-\>like('paymentStatus.description', '?1'), $expr-\>like('orders.orderTime', '?2'), $expr-\>like('billing.company', '?3'), $expr-\>like('billing.lastName', '?3'), $expr-\>like('billing.firstName', '?3'), $expr-\>like('billing.number', '?3'), $expr-\>like('shop.name', '?3'), $expr-\>like('orders.comment', '?3'), $expr-\>like('orders.customerComment', '?3'), $expr-\>like('orders.internalComment', '?3') ) ); $builder-\>setParameter(1, $filter['value'] . '%'); $builder-\>setParameter(2, '%' . $filter['value'] ); $builder-\>setParameter(3, '%' . $filter['value'] . '%'); break; case "from": $tmp = new \DateTime($filter['value']); $builder-\>andWhere($expr-\>gte('orders.orderTime', $tmp-\>format('Ymd'))); break; case "to": $tmp = new \Zend\_Date($filter['value']); $tmp-\>setHour('23'); $tmp-\>setMinute('59'); $tmp-\>setSecond('59'); $builder-\>andWhere('orders.orderTime \<= :orderTimeTo'); $builder-\>setParameter('orderTimeTo', $tmp-\>get('yyyy-MM-dd HH:mm:ss')); break; case 'details.articleNumber': $builder-\>andWhere('details.articleNumber LIKE :articleNumber'); $builder-\>setParameter('articleNumber', $filter['value'] . "%"); break; case 'customer.groupKey': $builder-\>andWhere($expr-\>eq($filter['property'], "'" . $filter['value'] . "'")); break; default: $builder-\>andWhere($expr-\>eq($filter['property'], $filter['value'])); } } } return $builder; } Fehler: Fatal error: Call to a member function andWhere() on a non-object in /kunden/117539_78141/webseiten/42final/engine/Shopware/Models/Order/Repository.php on line 287 Hier wäre ich dir für einen Tipp sehr dankbar.

Hat niemand eine Idee? Warum komme ich nicht an $builder ran? Gesendet von meinem iPhone mit Tapatalk

Hallo, nur als Idee: Musst Du nicht … $builder = $arguments-\>get('builder'); $filters = $arguments-\>get('filters'); … anstatt … $builder = $arguments-\>getBuilder(); $filters = $arguments-\>getFilters(); … schreiben? Hab selbst mal an einer ähnlichen Stelle gehangen, ohne Lösung jedoch: programmierung-f56/orm-querybilder-gegenstuck-von-andwhere-t15237.html?hilit=andWhere#p69919 Gruß, Michael

Is grade Wurscht, sollte beides gehen …

Hatte beides probiert. Geht beides nicht! Gesendet von meinem iPhone mit Tapatalk

Was hat builder für einen Zustand? Null?

nein, ich denke er ist schon irgendwie vorhanden. Wenn ich mit var_dump $builder ausgebe, so hängt sich der Firebox auf. Lädt ewig und stürzt ab. Aber auf andWhere() kann ich eben nicht zugreifen.

Event_Hook_HookArgs hat kein get oder getBuilder function. Du musst glaub ich auch nicht den builder von der gehookten class nehmen. Dürfte mit $builder = Shopware()->Models()->createQueryBuilder(); gehen Gesendet von meinem HTC One mit Tapatalk

Hi, das geht auch nicht. Jetzt fällt mir aber was auf. Der Fehler tritt nicht in meinem Code auf, sondern in der Repositoryy: Fatal error: Call to a member function andWhere() on a non-object in webseiten/42final/engine/Shopware/Models/Order/Repository.php on line 287 Anbei ein Screen. die Funktion in 285 hooke ich ja per Replace. Siehe oben. Der Fehler kommt dann beim Aufruf von anWhere() in Line 287. Hat dazu noch jemand eine Idee?

Nicht Return builder sondern atteibute->setreturn(builder) So glaube ich…

1 „Gefällt mir“

[quote=„Martin Weinmayr“]Nicht Return builder sondern atteibute->setreturn(builder) So glaube ich…[/quote] oh man… danke. Manchmal sieht man den Wald vor lauter Bäumen nicht. Jetzt geht es. Und den Bilder bekomme ich wie anfangs geschrieben über $builder = $arguments->getBuilder(); oder $builder = $arguments->get(‚builder‘); Besten dank.