Guten Morgen, ich versuche die OrderQuery um die Kundenatributte zu erweitern. Leider ohne Erfolg. Ich habe es die ganze Zeit über ein Plugin versucht, da es nicht ging benutze ich im Moment zum Test den Holzhammer und schreibe es direkt in die Files. Aber auch hier geht es nicht. Ich habe folgendes bearbeitet: engine/Shopware/Models/Order/Repository.php Hier habe ich „customerAttribute“ hinzugefügt und die Verknüpfung /\*\* \* Helper function to create the query builder for the "getOrdersQuery" function. \* This function can be hooked to modify the query builder of the query object. \* @param null $filters \* @param $orderBy \* @return \Doctrine\ORM\QueryBuilder \*/ public function getBackendOrdersQueryBuilder($filters = null, $orderBy = null) { $builder = $this-\>getEntityManager()-\>createQueryBuilder(); $builder-\>select(array( 'orders', 'details', 'customer', 'payment', 'billing', 'billingCountry', 'shop', 'dispatch', 'paymentStatus', 'orderStatus', 'billingAttribute', 'attribute', 'customerAttribute' )); $builder-\>from('Shopware\Models\Order\Order', 'orders'); $builder-\>leftJoin('orders.payment', 'payment') -\>leftJoin('orders.paymentStatus', 'paymentStatus') -\>leftJoin('orders.orderStatus', 'orderStatus') -\>leftJoin('orders.billing', 'billing') -\>leftJoin('orders.customer', 'customer') -\>leftJoin('orders.details', 'details') -\>leftJoin('billing.country', 'billingCountry') -\>leftJoin('orders.shop', 'shop') -\>leftJoin('orders.dispatch', 'dispatch') -\>leftJoin('billing.attribute', 'billingAttribute') -\>leftJoin('orders.attribute', 'attribute') -\>leftJoin('customer.attribute', 'customerAttribute'); if (!empty($filters)) { $builder = $this-\>filterListQuery($builder, $filters); } $builder-\>andWhere($builder-\>expr()-\>notIn('orders.status', array('-1'))); $builder-\>andWhere('orders.number IS NOT NULL'); if (!empty($orderBy)) { //add order by path $builder-\>addOrderBy($orderBy); } return $builder; }
Das Ganze wird ja in Backend Order Controller (getList)aufgerufen: engine/Shopware/Models/Order/Order.php Hier habe ich in die Foreach eine Dumpausgabe integriert, welche mir die Werte in eine Textfile schreibt. protected function getList($filter, $sort, $offset, $limit) { try { if (empty($sort)) { $sort = array(array('property' =\> 'orders.orderTime', 'direction' =\> 'DESC')); } else { $sort[0]['property'] = 'orders.' . $sort[0]['property']; } $query = $this-\>getRepository()-\>getBackendOrdersQuery($filter, $sort, $offset, $limit); $query-\>setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE\_ARRAY); $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query); //returns the total count of the query $total = $paginator-\>count(); //returns the customer data $orders = $paginator-\>getIterator()-\>getArrayCopy(); foreach($orders as $key =\> &$order) { $tmpRes = ""; $datei = fopen("a\_log.txt","a+"); foreach($order as $schluessel =\> $wert) $tmpRes.= $schluessel.": ".$wert."\n"; fwrite($datei, $tmpRes. "\n" . "-------------------------------------------------------------------------" . "\n"); fclose($datei); ....
Leider tauchen meine Kunden Attribute nicht auf. Lösche ich hingegen eine bestehende Verlinkung (attributes) so fehlen diese Felder nachher in dem Array. Könnt ihr mir sagen wo mein Fehler liegt? Danke
okay, ich denke ich muss das Model noch erweitern: ‚Shopware\Models\Order\Order‘ Hat mir hierzu jemand ein Beispiel? Danke
Je länger ich hier rumprobiere um so unverständlich wird es für mich. Das Model erweiter ich ja eig. mit meiner Left Anweisung, oder? Daher sollte es doch eig. gehen. Shopware, habt ihr mir nicht einen Tipp?
Guten Morgen, hat mir dazu niemand eine Info? Ich habe das Problem nun übergangen, in dem ich das Array einfach dirkt im Controller erweitere. Aber schöner wäre es sicher direkt über das Model gewesen. Daher bin ich immer noch an einer Lösung interessiert.
Hallo, bin da noch ganz am Anfang, aber du kannst ja erst einmal via After-Hook den Querybuilder unter getBackendOrdersQueryBuilder erweitern und muss dafür dann nicht in den Core. Mehr kann ich aktuell leider beitragen ;-). Gruß, Michael
das habe ich ja gemacht da es aber nicht ging. bin ich direkt an die core files.
Bist Du hier weitergekommen? Das hinzufügen der CustomerAttribute über den Hook funktioniert bei mir und sie landen auch in order[‚customer‘][‚attribute‘]. Allerdings kommt dann das Problem in der obigen Funktion „getList“: Es wird eine zusätzliche Abfrage „$additionalOrderDataQuery“ ausgeführt und das Ergebnis mit Array_merge in $order geschrieben. Dadurch wird $order[‚customer‘] überschrieben und die Attribute sind wieder weg. Warum werden hier Daten doppelt abgefragt? Leider lässt sich auch „getBackendAdditionalOrderDataQuery“ nicht mit einem Hook abfangen, da es ja nicht den Builder sondern das fertige Query zurückgibt. Wie könnte ich erreichen, dass die CustomerAttribute abgefragt und nicht wieder überschrieben werden?