CustomerQuickView: getListQuery() um Umsatz und Anzahl Bestellungen erweitern

Hallo Zusammen,

ich stehe vor einem Problem und hoffe, mir kann hier jemand helfen.

Ich habe der Kundenübersicht im Backend zwei Tabs hinzugefügt, die Umsatz und Bestellungen darstellen sollen. Um die entsprechenden Daten zu bekommen, hooke ich in der getListQuery() function des CustomerQuickView Controllers. Hier möchte ich die Query erweitern und da liegt auch das Problem. Die Query scheint Probleme mit count() bzw SUM zu haben und schmeißt mir im Frontend nur noch den ersten Kunden raus (allerdings mit korrekter Angabe der Seitenzahlen).

public function extendListData ( \Enlight_Hook_HookArgs $args)
	{

        $query = $args->getReturn();
        $query->addSelect(
            array(
                $query->expr()->count('doneOrders.id') . ' as orderCount',
                'SUM(doneOrders.invoiceAmount) as amount'
            ));
        $query->LeftJoin('customer.orders', 'doneOrders', \Doctrine\ORM\Query\Expr\Join::WITH, 'doneOrders.status <> -1 AND doneOrders.status <> 4');
        $args->setReturn($query);
}

Entferne ich count() und SUM, bekomme ich im Frontend zwar die falschen Ergebnisse, aber immerhin werden alle Kunden angezeigt. Bspw. so:

 public function extendListData ( \Enlight_Hook_HookArgs $args)
	{

        $query = $args->getReturn();
        $query->addSelect(
            array(
                'doneOrders.invoiceAmount as amount'
            ));
        $query->LeftJoin('customer.orders', 'doneOrders', \Doctrine\ORM\Query\Expr\Join::WITH, 'doneOrders.status <> -1 AND doneOrders.status <> 4');
        $args->setReturn($query);

Die Query stammt aus dem Customer Model Repository (getCustomerDetailQueryBuilder).Weiß hier jemand, wie ich hier drum herum arbeiten kann?

Beste Grüße

Hallo @bbihl‍,

du hast das ’ groupBy’ statement vergessen.

schau mal hier:

 

VG,

Tel.: +49 755 - 183 990 00 | Web: http://enbit.de/

1 Like

Hallo @ahmadsaad‍,

vielen Dank für die schnelle Antwort, daran lag es! Ich hatte gehofft, dass ich mich um die Sortier Funktion nicht manuell kümmern muss, scheint aber leider der Fall zu sein, denn sie funktioniert nicht, wie sie soll. Ich bin einfach mal so frei und frage dich direkt, ob du einen Ansatz für mich hast, wie ich diese am besten für meine zwei Custom Tabs implementieren kann?

Grüße

Hallo @bbihl‍,

ich verstehe nicht genau was ist das Problem mit Sortier.

ob du meinst sortieren nach ‚orderCount‘ und ‚amount‘ ,  dann du hast Zwei situation:

1- Elasticsearch backend  ist disabled, dann das code benutzen das ‚getListQuery‘ builder um die Daten zu sortieren, dann du kannst einfach beim deine Funktion ‚extendListData‘, das Post Request ‚sort‘ param überprüfen ob es ist bei ‚orderCount‘ or ‚amount‘ und :

$query->addOrderBy($sort)

2- Elasticsearch backend  ist enable dann es ist komplexiert (ich glaube), oder nicht Angry-Face  ich weiß nicht genau ( ich habe nur ein mal auf kleine Aufgabe mit Elasticsearch gearbeitet, vielleicht jemand andere hat ein einfach Lösung).

hier das Code würde das ‚loadFromRepository‘ Funktion ausführen, und benutzen die Elasticsearch um die Datein zu sortiern und die ‚getListQuery‘ builder sortieren zu überschreiben exact in diese Line .

um diese zu behoben ich glaube du muss diese Doc lessen:

https://developers.shopware.com/developers-guide/elasticsearch/

ich hofe diese werde dir hilfen.

 

VG,

Tel.: +49 755 - 183 990 00 | Web: http://enbit.de/

1 Like

Hallo @ahmadsaad‍,

ich wollte nur (für die Nachwelt) Bescheid geben, dass es daran lag, dass ich vergessen habe, in getModelFields() zu hooken und die Felder entsprechend um meine hinzugefügten zu erweitern, damit das sortieren für diese überhaupt funktionieren kann. Danke für deine Hilfe!

 

    //Hook into CustomerQuickView->getModelFields in order to make the added fields sortable
    public function extendModelFields( \Enlight_Hook_HookArgs $args)
    {
        $fields = $args->getReturn();

        $fields = array_merge($fields, [
            'orderCount' => ['alias' => 'orderCount', 'type' => 'int'],
            'amount' => ['alias' => 'amount', 'type' => 'float']
        ]);

        $args->setReturn($fields);
        
    }

 

 

 

1 Like