Eigene Backend-Spalte sortieren?

Hi zusammen,

ich habe über ein Plugin eine eigene Spalte im der Bestellübersicht hinzugefügt. Diese möchte ich nun gerne sortieren - allerdings bleibt “sortable: true” ohne Auswirkung.

custom/plugins/MeinPlugin/Resources/views/backend/order/view/meinplugin/list/list.js sieht so aus:

//{block name="backend/order/view/list/list" append}
//{namespace name="backend/meinplugin/main"}
Ext.define('Shopware.apps.Order.view.meinplugin.list.List', {

    /**
     * Defines an override applied to a class.
     * @string
     */
    override: 'Shopware.apps.Order.view.list.List',
	
    /**
     * Overrides the getColumns function of the overridden ExtJs object
     * and inserts two new columns
     * @return
     */
    getColumns: function() {
        var me = this;

        var columns = me.callOverridden(arguments);

        var columnDate = {
            header: 'Titel',
            dataIndex:'mein_attributfeld',
            flex: 2,
            sortable: true
        };
        
        return Ext.Array.insert(columns, 1, [columnDate]);
    }
	
});
//{/block}

Das Model habe ich entsprechend erweitert:

custom/plugins/MeinPlugin/Resources/views/backend/order/model/meinplugin/attribute.js

//{block name="backend/order/model/order/fields" append}
{ name: 'mein_attributfeld', type: 'string', useNull: true },
//{/block}

Hat jemand eine Idee, warum ein Klick auf den Spaltenheader gar keine Auswirkung hat?

Viele Grüße,
Constantin

Ok, ich habe inzwischen gemerkt, dass eine Exception fliegt wenn ich sortiere.

Offenbar schlägt der SQL Query fehl:

Uncaught Doctrine\ORM\Query\QueryException: SELECT orders.id FROM Shopware\Models\Order\Order orders LEFT JOIN orders.attribute attribute WHERE orders.number IS NOT NULL AND orders.status != :cancelStatus ORDER BY orders.mein_attribut DESC in /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:43

Das Attribut ist natürlich nicht Teil der Orders Tabelle, daher kann es nicht funktionieren.

Wie kann ich nach eigenen Attributen sortieren?

Ich habe gesehen, dass in

engine/Shopware/Controllers/Backend/Order.php

in der Funktion resolveSortParameter() Präfixe verwendet werden. Daher habe ich versucht, den dataIndex in custom/plugins/MeinPlugin/Resources/views/backend/order/view/meinplugin/list/list.js zu ändern und „attribute.“ davor zu schreiben:

//{block name="backend/order/view/list/list" append}
//{namespace name="backend/meinplugin/main"}
Ext.define('Shopware.apps.Order.view.meinplugin.list.List', {

    /**
     * Defines an override applied to a class.
     * @string
     */
    override: 'Shopware.apps.Order.view.list.List',
	
    /**
     * Overrides the getColumns function of the overridden ExtJs object
     * and inserts two new columns
     * @return
     */
    getColumns: function() {
        var me = this;

        var columns = me.callOverridden(arguments);

        var columnDate = {
            header: 'Titel',
            dataIndex:'attribute.mein_attribut',
            flex: 1,
            sortable: true,
            renderer:me.dateColumn
        };
        
        return Ext.Array.insert(columns, 1, [columnDate]);
    },

    /**
     * Formats the date column
     *
     * @param [string] - The order time value
     * @return [string] - The passed value, formatted with Ext.util.Format.date()
     */
    dateColumn:function (value, metaData, record) {
        if ( value === Ext.undefined ) {
            return value;
        }

        return Ext.util.Format.date(value);
    }
	
});
//{/block}

Aber der SQL Query schlägt leider trotzdem fehl. Hat jemand einen Tipp?

Ist so etwas überhaupt vorgesehen?

Kannst du mal ein Screenshot vom Request machen?

 

@Shyim schrieb:

Kannst du mal ein Screenshot vom Request machen?

 

Was meinst du genau damit?

Hierhin geht der Request, wenn ich auf den Spalten-Header zum Sortieren klicke:

http://localhost:8888/sw56dev/backend/Order/getList?\_dc=1566907641249&page=1&start=0&limit=20&sort=[{"property"%3A"mein\_attribut"%2C"direction"%3A"DESC"}]

Das ist die Fehlermeldung, die dann geworfen wird:

Fatal error: Uncaught Doctrine\ORM\Query\QueryException: SELECT orders.id FROM Shopware\Models\Order\Order orders LEFT JOIN orders.attribute attribute WHERE orders.number IS NOT NULL AND orders.status != :cancelStatus ORDER BY orders.mein_attribut DESC in /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:43
Stack trace:
#0 /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(491): Doctrine\ORM\Query\QueryException::dqlError('SELECT orders.i...')
#1 /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(764): Doctrine\ORM\Query\Parser->semanticalError('line 0, col 177...', Array)
#2 /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(271): Doctrine\ORM\Query\Parser->processDeferredPathExpressions()
#3 /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(359): Doctrine\ORM\Query\Parser->getAST()
#4 /Applications/MAMP/htdocs/sw56dev/vendor in /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php on line 65

Wenn ich wie gesagt den dataIndex in „attribute.mein_attribut“ ändere, sieht es so aus:

Request-Adresse:

http://localhost:8888/sw56dev/backend/Order/getList?\_dc=1566907957564&page=1&start=0&limit=20&sort=[{"property"%3A"attribute.mein\_attribut"%2C"direction"%3A"ASC"}]

Fehlermeldung:

Fatal error: Uncaught Doctrine\ORM\Query\QueryException: SELECT orders.id FROM Shopware\Models\Order\Order orders LEFT JOIN orders.attribute attribute WHERE orders.number IS NOT NULL AND orders.status != :cancelStatus ORDER BY attribute.mein_attribut ASC in /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:43
Stack trace:
#0 /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(491): Doctrine\ORM\Query\QueryException::dqlError('SELECT orders.i...')
#1 /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(764): Doctrine\ORM\Query\Parser->semanticalError('line 0, col 180...', Array)
#2 /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(271): Doctrine\ORM\Query\Parser->processDeferredPathExpressions()
#3 /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(359): Doctrine\ORM\Query\Parser->getAST()
#4 /Applications/MAMP/htdocs/sw56dev/vend in /Applications/MAMP/htdocs/sw56dev/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php on line 65

Falls ich dich falsch verstanden habe, gib mir nochmal einen Hinweis, was du genau sehen willst :slight_smile: