SW 5.2 - Plugin Entwicklung Backend - Category.Store

Hallo, die Frage wurde glaub ich schon mal gestellt aber ldeir nicht komplett beatwortet.

Wir würden gerne mit einem eigegen Plugin auf einen vorhandenen Store (z.B. Catgory,Country etc.) zurückgreifen.

Leider funktioniert das ja nicht einfach indem man den Store läd:

Ext.define('Shopware.apps.MyPlugin.view.detail.MyPlugin', {
    extend: 'Shopware.model.Container',
    padding: 20,

    configure: function() {
        var me = this;
        return {
            controller: 'MyPlugin',
            fieldSets: [
                {
                    title: 'Details',
                    layout: 'fit',
                    fields: {
	                    username: {
                            fieldLabel: '{s name=username}Name{/s}',
                            allowBlank: false,

                        },
                        maincategory: {                            
                            xtype: 'combobox',
                            fieldLabel: '{s name=emailgroup}zugewiesene Shop-Kategorie{/s}',
                            displayField: 'description',
                            valueField: 'id',
                            allowBlank: true,
                            store:Ext.create('Shopware.apps.Base.store.Category').load(),                                      
                        },
                                    
                    }
                }
            ]
        };
    }
});

Kann mir da jemand weiterhelfen? Ich würde dann gerne auch ein kleines Beispiel Plugin hier posten.

 

Danke & Viele Grüße

Oliver

Das .load() kannst du weglassen dafür ist die Combobox zuständig.

// ...
store: Ext.create('Shopware.apps.Base.store.Category'), 
// ...

Viele Grüße

1 Like

Hallo,

leider hat das nicht ganz so geklappt wie ich wollte. Habe es nun wie folgt gelöst:

in der app.js einen eigenen CategryPath Store hinzugfügt:

stores: ['ModuleListing','CategoryPath'],

Dann den Store store/category_path.js unter stores angelegt:

Ext.define('Shopware.apps.MyModule.store.CategoryPath', {
    extend:'Ext.data.Store',
    fields: ['id', 'name'],
    autoLoad: true,
    pageSize: 25,
    proxy:{
        type:'ajax',
        url: '{url controller=category action=getPathByQuery}',
        reader:{
            type:'json',
            root:'data',
            totalProperty:'total'
        }
    }
});

in der view/detail dann:

mycategory: {                               
    xtype:'combobox',
    name:'mycategory',
    fieldLabel: '{s name=category}Kategorie{/s}',
    emptyText: '{s name=fields/please_select}Please select...{/s}',
    store: Ext.create('Shopware.apps.MyModule.store.CategoryPath').load(),
    valueField:'id',
    displayField:'name',
    pageSize: 25,
    mode:'local',
    flex: 1,
    allowBlank: true
 },

dann macht er genau das was ich will:

Allerdings zeigt er dann nach dem speichern und nach dem erneutem öffnen nur noch die ID an.

Vermute da fehlt dann eine callback Funktion oder? Hab schon vieles versucht - leider ohne Erfolg.

Also, wie bekommt man den Namen anstelle der ID angezeigt?

Weiß hier jemand Rat?

Viele Grüße

Oliver

Kannst du nochmal Das .load() weglassen.

das macht keinen Unterschied ob mit Load oder ohne. Es wird immer die ID nach dem speichern angezeigt.

ja jetzt verstehe ich das Problem.

Sie können ‘render’ Parameter benutzen.

mycategory: {                               
    xtype:'combobox',
    name:'mycategory',
    fieldLabel: '{s name=category}Kategorie{/s}',
    emptyText: '{s name=fields/please_select}Please select...{/s}',
    store: Ext.create('Shopware.apps.MyModule.store.CategoryPath').load(),
    valueField:'id',
    displayField:'name',
    pageSize: 25,
    mode:'local',
    flex: 1,
    allowBlank: true,

    renderer: Ihrefunktion

 },

//this is a example on your function you can find it in themes/Backend/ExtJs/backend/article/view/category/seo.js

    categoryRenderer: function(value, meta, record) {
        var me = this;

        var category = me.categoryStore.getById(value);

        if (category) {
            return category.get('name');
        } else {
            return value;
        }
    },

Ich hoffe diese werde Ihnen helfen.

Viele Grüße,

Ahmad

push … leider haben wir es immer noch nicht hinbekommen. Es geht immer noch darum warum wir nicht den Namen angezeigt bekommen sondern die ID.

Gibt’s ja eigendlich gar nicht…

Komisch ist auch das wir bei einem eigenen rednerer nichst zurückbekommen. Selbst ein consoloe.log(1) wird nicht ausgegeben.

Ideen?

Viele Grüße

Oliver

Ich bin hier wegen dem gleichen Problem hier gelandet. Für alle die hier auch wegen der gleichen Problematik landen hier die Beschreibung zur Lösung: 

Die Definition der Komponenten in der  view/detail  wird vor dem Laden des Stores durchgeführt. Der Store lädt die Daten per Ajax asynchron nach. Daher wird zuerst die ID angezeigt, da die Inhalte noch nicht vorhanden sind. Man muss daher nach dem Laden der Informationen den View nochmal erneuern. Hier der Codeschnipsel:

var me = this;

var factory = Ext.create('Shopware.attribute.SelectionFactory');

me.customFacetStore = factory.createEntitySearchStore("Shopware\\Models\\Search\\CustomFacet").load({ limit: 1000 });

me.customFacetStore.on("load", function() {
  me.view.refresh();
});

Ich bin mir unsicher, ob der view in jeder Klasse so existiert. In meinem Fall hat es so aber geklappt. 

Grüße

Matthäus

1 Like