Backend ExtJS Store mit eigenem Model

Hallo zusammen,

ich versuche im Backend ein eigenes Model in der Detailansicht zu laden.
Das Formular wird angezeigt, nur das Laden der Daten will nicht funktionieren.

 Ich habe ein Model:

Ext.define('Shopware.apps.MegaPayment.model.CreditCardData', {
    extend: 'Shopware.data.Model',

    configure: function() {
        return {
            controller: 'CreditCardDataController',
            detail: 'Shopware.apps.MegaPayment.view.detail.CreditCardData'
        };
    },


    fields: [
        { name : 'id', type: 'int'},
        { name : 'accountHolder', type: 'string'},
        { name : 'cardProvider', type: 'string'},
        { name : 'cardNumber', type: 'string'},
        { name : 'cvc', type: 'string'},
        { name : 'expireDateMonth', type: 'string'},
        { name : 'expireDateYear', type: 'string'},
        { name : 'order_id', type: 'int'}
    ]

});

und den dazugehörigen Store:

Ext.define('Shopware.apps.MegaPayment.store.CreditCardData', {
    extend:'Shopware.store.Listing',
    configure: function() {
        return { controller: 'CreditCardDataController' };
    },
    model: 'Shopware.apps.MegaPayment.model.CreditCardData'
});

Wie ich jetzt die records aus dem store bekomme ist mir nicht ganz klar

/**
 * Created by ollie on 03.02.17.
 */
//{block name="backend/order/view/detail/window"}
// {$smarty.block.parent}
Ext.define('Shopware.apps.MegaPayment.view.detail.Window', {
    override: 'Shopware.apps.Order.view.detail.Window',
    createTabPanel: function () {

        var me = this;

        var tabPanel = me.callParent(arguments);
        var orderId = me.record.get('id');

        var store = Ext.create('Shopware.apps.MegaPayment.store.CreditCardData');
        var creditCardData = store.findRecord('order_id', orderId);
        if(!creditCardData){
            creditCardData = Ext.create('Shopware.apps.MegaPayment.model.CreditCardData');
        }

        var detailView =Ext.create('Shopware.apps.MegaPayment.view.detail.CreditCardData', {
            record: creditCardData
        });
        tabPanel.add(detailView);

        return tabPanel;
    }


});
//{/block}

findRecors liefert mit immer null. Scheinbar funktioniert das Mapping zwischen store und BackendController nicht.
Dokumentation von Secha/Shopware und die Forernsuche haben mich an dieser stelle nicht weiter gebracht.
Gibt es Beispiele wie man mit Stores richtig arbeitet, was mach ich falsch?

hier noch der Controller:

class Shopware_Controllers_Backend_CreditCardDataController extends Shopware_Controllers_Backend_Application
{
    protected $model = 'Shopware\CustomModels\MegaPayment\CreditCardData';
    protected $alias = 'CreditCardData';
    
}

Vielen Dank
Oliver

 

*Edited some typos

Hi Oliver,

ich würde das Laden des Datensatzes anders aufziehen:

  • Im Controller die Möglichkeit geben, nach einer OrderID zu filtern
  • Die OrderID über die ExtraParams des Stores mit übergeben

Das hätte den Vorteil, dass du prinzipiell nicht immer alle Daten laden müsstest um dann JS-seitig nach dem richtigen Eintrag zu suchen, sondern von vorne herein nur den Eintrag vom Backend bekommen würdest, den du haben möchtest.

findRecord hab ich noch nie benutzt - aber ich vermute hier ist das Problem, dass der Store kein autoload: true hat und dort, wo der Store erstellt wird, auch nicht explizit “load” auf dem Store aufgerufen wird.

Vielleicht hilft euch das schon.

 

Viele Grüße

Philipp

1 Like