Backend Order Detail um eigenes Model erweitern

Hallo Leute!

Ich möchte die Bestellübersicht um ein eigenes Feld erweitern. Der Wert des Feldes soll dabei aus einem eigenem Model geladen werden. Die Darstellung einer neuen Spalte ist mir bisher schon einmal geklückt nun fehlt noch der korrekte Wert darin:

Es handelt sich um die Spalte “Download PDF” in welcher der Wert “URL goes here…” hinterlegt wurde.

Das Ganze funktioniert so:

  1. Backend Subscriber registriert die Pfade zu den Views welche ich überschreibe.
  2. In den Views registriere ich eine neue Spalte getColumns function.
  3. Danach wird der Snippet noch zur Verfügung gestellt.
  • Es gibt im Moment noch keinen Controller.
  • Keine Storages oder Models wurden registriert.

Hier noch ein wenig Code hierzu:

Subscriber/BackendSubscriber.php

    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PostDispatch_Backend_Order' => 'onOrderPostDispatch'
        ];
    }

    public function onOrderPostDispatch(\Enlight_Event_EventArgs $arguments)
    {
        /** @var \Shopware_Controllers_Backend_Order $controller */
        $controller = $arguments->getSubject();
        $view = $controller->View();
        $request = $controller->Request();

        if ($request->getActionName() === 'load') {
            $view->extendsTemplate(
                'backend/cc_extend_order_detail/view/detail/position.js'
            );

            $view->extendsTemplate(
                'backend/cc_extend_order_detail/view/list/position.js'
            );
        }
    }

Resources/views/backend/cc_extend_order_detail/view/list/position.js

//{namespace name=backend/order/main}

//{block name="backend/order/view/list/position"}
// {$smarty.block.parent}
Ext.define('Shopware.apps.CcExtendOrderDetail.view.list.Position', {

    override:'Shopware.apps.Order.view.list.Position',

    snippets: {
        // ...
        // additional snippets...
        downloadPdf: '{s name=column/download_pdf}Download PDF{/s}',
    },

});
//{/block}

Resources/views/backend/cc_extend_order_detail/view/detail/position.js

//{namespace name=backend/order/main}

//{block name="backend/order/view/detail/position"}
// {$smarty.block.parent}
Ext.define('Shopware.apps.CcExtendOrderDetail.view.detail.Position', {

    override:'Shopware.apps.Order.view.detail.Position',

    getColumns:function (grid) {
        // ...

        return [
            // ...
            {
                header: grid.snippets.downloadPdf,
                dataIndex: 'inStock',
                flex:1,
                renderer: function(value, metaData, record) {
                    return 'url goes here...';
                }
            },
            // ....
        ];

    },

});
//{/block}

Und nun zur Datenstruktur:

  • Das Model OrderDetailState ist mit dem Detail model verknüpft.
  • Das Model StateDocument ist mit dem OrderDetailState model verknüpft.

Hier ein kurzes Beispiel wie man mithilfe des ModelManagers auf den Wert zugreifen könnte:

$orderDetailId = 1;

$orderDetailState = $this->modelManager
            ->getRepository(OrderDetailState::class)
            ->findOneBy([
                'orderDetail' => $orderDetailId,
            ]);

$downloadUrl = $this->modelManager
            ->getRepository(StateDocument::class)
            ->findOneBy([
                'editorState' => $orderDetailState->getEditorState(),
            ]);

$downloadUrl = $downloadUrl->getDownloadUrl();

Foot-in-Mouth Wie kann ich nun diese PDF URL auslesen und in meiner View darstellen?

 

Ich bin für alle Vorschläge offen und Danke Euch für die investiererte Zeit.

Gruss

Alexander

Hat niemand hierzu eine Idee? Bin recht am verzweifeln. 

Habe bereits ein Buch gekauft und lese nun zum hundersten mal die folgenden Anweisungen ohne dass mir weitergeholfen wurde:

Habe ich meine Frage unklar ausgedrückt?

Oder hat hier wirklich niemand eine Lösung wie man im Backend (Order Detail Position) eine eigene Spalte anzeigen kann?

Gruss

Alexander

Vielleicht weiss jemand ja was der DataIndex in der GetColumns methode ausführt? Wo definiere ich einen neuen Index?

Auszug aus: themes/Backend/ExtJs/backend/order/view/detail/position.js

            {
                header: grid.snippets.quantity,
                dataIndex: 'quantity',
                flex:1,
                editor: {
                    xtype: 'numberfield',
                    allowBlank: false,
                    minValue: 0
                }
            },

 

Ich hänge nun auch schon ein paar Tage an einem sehr ähnlichen problem. Und das was mich beschäftigt ist ebenfalls dieser „dataIndex“ der scheinbar nicht auf die Attribute/Freitextfelder zugreifen kann. Habe in einem anderen Post gelesen, dass Extjs wohl auf dem Level nicht mit verschachtelten Daten arbeiten kann.
Für die Darstellung der Column benötigst du noch eine rendererFunktion.

In meinem Fall habe ich es so gelöst, ebenfalls in der getColumns:

    getColumns: function (grid) {
        var me = this;
        me.callParent(arguments);
        var columns = me.callOverridden(arguments);

        var column = {
            header: 'Gewicht',
            dataIndex: 'details.attribute.mrbkArticleWeight',
            flex: 2,
            renderer: function (value, metaData, record) {                
                me.attributeForm = Ext.create('Shopware.attribute.Form', {
                    table: 's_order_details_attributes',
                    columnName: 'mrbk_article_weight'
                });
                
                me.attributeForm.loadAttribute(record.get('id'));
                var attributeName;
                Ext.Ajax.request({
                    url: '{url controller=AttributeData action=loadData}',
                    params: {
                        _foreignKey: record.get('id'),
                        _table: 's_order_details_attributes'
                    },
                    async: false,
                    success: function(responseData, request) {
                        var response = Ext.JSON.decode(responseData.responseText);
                        attributeName = response.data.__attribute_mrbk_article_weight;
                    }
                });
                return attributeName;
            },
            editor: {
                xtype: 'numberfield',
                allowBlank: true,
                decimalPrecision: 2,
            }
        };

        columns = Ext.Array.insert(
            columns,
            columns.length - 1,
            [column]
        );

        console.log(columns);
        return columns;
    }

});

Die Darstellung des Wertes funktioniert, bis ich den Inline-Editor öffne, dann verschwindet der Wert. Nachdem der Wert manipuliert ist, bleibt er auch nach dem Öffnen des Editors stehen, aber nicht initial, beim ersten Öffnen des Editors. Auch da habe ich den „dataIndex“ im Verdacht. Weil der Wert für die Darstellung ja erst beim Rendern/Anzeigen der Spalte aus den Attributen geladen wird und nicht inital wenn der Store geladen wird. Naja…

Vielleicht hilft dir ja mein Code-Schnipsel.

Allerbester Gruß

1 „Gefällt mir“

Hallo @BatsiDrama‍

Vielen Dank für Deine Antwort.

Ich habe mittlerweile alles in die Order Attributes ausgelagert da ich hier nicht weiter kam.

Gerne werde ich bei Zeiten deinen Vorschlag umsetzen.

Gruss

Alexander