Hilfe bei der Erweiterung des Bestell-Moduls mit ExtJS

Hallo liebes SW-Forum,

ich versuche mithilfe von ExtJS das Bestellmodul so zu erweitern, dass alle angehakten Bestellungen (plus Stücklistenartikel und deren Bestandteile, etc.) in eine CSV-Datei geschrieben werden.
Das Erweitern des Bestell-Moculs funktioniert soweit und eine Controller-Funktion wird beim Klicken des Buttons (exportiere) ausgeführt.
Dabei wird jedoch ein Fehler geworfen: Uncaught TypeError: Cannot read property ‘getSelectionModel’ of undefined

Daher meine Frage, wie greife ich auf das Grid zu, um danach für jeden Artikel die Stapelverarbeitung auszuführen?
Ich habe mich hierbei an das Tutorial von Shopware gehalten: Backend Components - Batch Processes

app.js

//{block name="backend/order/application"}
//{$smarty.block.parent}
//{include file="backend/export_orders/controller/export.js"}
//{/block}

view/list/list.js

//{namespace name="backend/export_orders/order"}
//{block name="backend/order/view/list/list"}
//{$smarty.block.parent}
Ext.define('Shopware.apps.CstormExportOrders.view.list.List', {
    override: 'Shopware.apps.Order.view.list.List',
    alias: 'widget.order-listing-grid',

    /**
     * Adds the specified events to the list of events which this Observable may fire.
     */
    registerEvents: function() {
        this.addEvents(
            /**
             * Event will be fired when the user clicks the "delete order" action column icon
             * which is placed in the order list in the options column
             *
             * @event
             * @param [object] - Form values
             */
            'exportOrders'
        );
    },

    getToolbar: function () {
        var me = this,
            toolbar = me.callParent(arguments);

        me.createExportButton = me.createExportButton();
        toolbar.insert(1, me.createExportButton);

        return toolbar;
    },

    createExportButton: function() {
        var me = this;

        return Ext.create('Ext.button.Button', {
            // iconCls:'sprite-drive-download',
            text: 'Export Orders',
            // action:'exportOrders',
            disabled:true,
            handler: function() {
                console.log('button clicked...');
                console.log(me);
                me.fireEvent('exportOrders', me);
            }
        });
    },

    /**
     * Creates the grid selection model for checkboxes
     *
     * @return [Ext.selection.CheckboxModel] grid selection model
     */
    getGridSelModel:function () {
    /* ... */
    }
});
//{/block}

controller/export.js

//{namespace name=backend/order/list}
Ext.define('Shopware.apps.CstormExportOrders.controller.Export', {

    /**
     * Override the order list controller
     * @string
     */
    override: 'Shopware.apps.Order.controller.List',

    init: function () {
        var me = this;

        me.callParent(arguments);
        me.control({
            'order-listing-grid': {
                exportOrders: me.displayProcessWindow()
            }
        });

        Shopware.app.Application.on('processExportOrders', me.onExportOrders);
    },

    displayProcessWindow: function(grid) {
        var seletion = grid.getSelectionModel().getSelection();

        if (seletion.length <= 0) return;

        Ext.create('Shopware.window.Progress', {
            title: 'Export Orders',
            configure: function() {
                return {
                    tasks: [{
                        event: 'processExportOrders',
                        data: selection,
                        text: 'Product [0] von [1]'
                    }],

                    infoText: 'Export Products'
                }
            }
        }).show();
    },

    onExportOrders: function (task, record, callback) {
        Ext.Ajax.request({
            url: '{url controller=CstormExportOrders action=exportOrders}',
            method: 'POST',
            params: {
                orderId: record.get('id')
            },
            success: function(response, operation) {
                callback(response, operation);
            }
        });
    }
});

 

Vielen Dank im Voraus

MfG Lennart

Also du rufst die Methode getSelectionModel ja innerhalb der Methode displayProcessWindow auf. Letztere erhält als Parameter die Variable grid. Diese ist wie du anhand der Fehlermeldung erkennen kannst null. Das liegt daran, dass du folgendes machst:

 me.control({
            'order-listing-grid': {
                exportOrders: me.displayProcessWindow() // dies führt die Methode aus und weist dem key 'exportOrders' den Rückgabewert der Methode zu
            }
        });

Hier wird ja auch nichts übergeben. Also die runden Klammern gehört da definitiv nicht hin. Allerdings kann ich dir auch nicht garantieren, dass dir das grid als Parameter im Event übergeben wird. Wo hast du das denn her?

Viele Grüße

Danke erstmal für die Antwort. Also ich habe mich an das Tutorial von Shopware gehalten: https://developers.shopware.com/developers-guide/backend-components/batch-processes/ Da wird jedoch auch displayProcessWindow aufgerufen und erhält grid als Parameter (zu sehen im letzen Codeblock im Beispiel).
Ich hattte es auch bereits vorher ohne die runden Klammern probiert, auch ohne Erfolg.

Grüße Lennart

Ich hattte es auch bereits vorher ohne die runden Klammern probiert, auch ohne Erfolg.

Ich glaube, dass du noch nicht zu 100% verstanden hast, was passiert, wenn du die Klammern hinzufügst. Da liegen Welten dazwischen. Sonst hättest du das gar nicht ausprobiert.

Der Unterschied zum Tutorial ist eben, dass im Tutorial das displayProcessWindow eine Instanz von Shopware.grid.Panel ist und bei dir eben von Shopware.apps.CstormExportOrders.view.list.List. Daher kann man hier schon mal nicht vom gleichen Verhalten ausgehen. Die Klasse Shopware.apps.CstormExportOrders.view.list.List ist schon mal kein Standard. Daher kann ich dir nicht sagen, welche Events bzw. Methoden diese unterstützt. Das musst du im Quellcode davon nachsehen.

Zusätzlich solltest du bei einem override keinen alias setzen und anstelle den original alias verwenden. Overrides in Ext.JS sind etwas exotisch.

Viele Grüße

1 „Gefällt mir“

Danke für die Hilfe. Es lag im Endeffekt nur an Kleinigkeiten. Das Problem wurde bereits gelöst und alles funktioniert.

Grüße Lennart