Plugin Store / Model laden

Hallo, Ich überschreibe mit einem Backend Plugin erfolgreich Componenten von Import-Export Fenster im Backend. Und zwar den Controller und die View. Nur brauch ich zusätzlich ein Store + Model. Import-Export verfügt über kein Store und Model. Meine eigenen sind soweit angelegt müssen aber noch geladen werden. Das heißt ich muss die Import-Export/App.js überschreiben mit Store und Model. Ebenso muss ich den Pfad bekannt machen. Wie geht so was? Wäre über ein Tipp dankbar.

Hi, du kannst den Block der app.js erweitern und deine eigenen Sachen mit einem Smarty include einbinden. lG Daniel Gesendet von meinem HTC One mit Tapatalk

Hast du dafür ein Beispiel? Wie gesagt view und Controller werden bereits erfolgreich überschrieben. Nun müssen eigene store und Model integriert und bekannt gemacht werden. Gesendet von meinem iPhone mit Tapatalk

Hi, hier einmal due zip runterladen und einen Blick in die app.js werfen. http://wiki.shopware.de/_detail_1071_871.html Besten Gruß, Daniel Gesendet von meinem HTC One mit Tapatalk

Hi Daniel, das hat mir schon weitergeholfen. Nun bekomme ich keinen Fehler und es wird auch scheinbar geladen. Führe ich aber im Contoller dies aus: /\*\* \* Creates the necessary event listener for this \* specific controller and opens a new Ext.window.Window \* @return void \*/ init: function() { var me = this; me.comboTreeCategoryStore = me.getStore('CategoryForComboTree'); me.mainWindow = me.getView('main.Mainwindow').create({ comboTreeCategoryStore: me.comboTreeCategoryStore }).show(); me.comboTreeCategoryStore.load(); console.log(me.comboTreeCategoryStore.getRootNode()); me.callParent(arguments); } So habe ich in der Debug Ausgabe im RootNode keine Child Elemente. Hier sollte eig. der Kategoriebaum erscheinen. Das ganz hartgecodet direkt im Core funktioniert. Daher kann es nur noch am Einbinden oder am Store / Model liegen. Ich denke an der Verbdinung Store zu Model. Wenn ich nämlich im Store kein Model angebe und dort direkt das Root Element anlege, so bekomme ich die Info in der Debug Ausgabe. Daher sollte die Frage sein, warum wird das Model nicht geladen? Hast du hier noch eine Idee? Die App.js habe ich nun eingebunden mit diesem Inhalt: //{block name="backend/import\_export/application" append} //{include file="backend/import\_export/store/category\_for\_combo\_tree.js"} //{include file="backend/import\_export/model/category\_for\_combo\_tree.js"} //{/block} Hier noch der Inhalt backend/import_export/store/category_for_combo_tree.js //{block name="backend/import\_export/store/category\_for\_combo\_tree"} Ext.define('Shopware.apps.ImportExport.store.CategoryForComboTree', { /\*\* \* Extend for the standard ExtJS 4 \* @string \*/ extend : 'Ext.data.TreeStore', remoteFilter: true, /\*\* \* Auto load the store after the component \* is initialized \* @boolean \*/ autoLoad : true, /\*\* \* Define the used model for this store \* @string \*/ model : 'Shopware.apps.ImportExport.model.CategoryForComboTree' /\* data: { text: 'Budget', area: 1, children: [{ name: 'Defense', area: 0.5, children: [] }, { name: 'Education', area: 0.3, children: [] }, { name: 'Debt', area: 0.2, children: [] }] }, \*/ }); //{/block} Hier noch der Inhalt: backend/import_export/model/category_for_combo_tree.js //{block name="backend/import\_export/model/category\_for\_combo\_tree"} Ext.define('Shopware.apps.ImportExport.model.CategoryForComboTree', { /\*\* \* Extends the default extjs 4 model \* @string \*/ extend : 'Ext.data.Model', /\*\* \* Defined items used by that model \* \* We use a reduces feature set here - just necessary fields are selected \* \* @array \*/ fields : [//{block name="backend/import\_export/model/category\_for\_combo\_tree/fields"}{/block} { name : 'name', type: 'string' }, { name : 'id', type: 'int' }, { name : 'parentId', type: 'int' }, { name : 'cls', type: 'string' }], proxy : { type : 'ajax', api : { read : '{url controller=category action=getList}' }, reader : { type : 'json', root: 'data' } } }); //{/block} Danke Dir.

okay, nun hab ich es fast. Ein Problem besteht noch, da kannst du mir sicher weiterhelfen. Die Übergabe des Objekt (Store) an das Window. In den Core Änderungen gehts, als Plugin nicht. Main.js: init: function() { var me = this; me.comboTreeCategoryStore = me.getStore('CategoryForComboTree'); me.mainWindow = me.getView('main.Mainwindow').create({ comboTreeCategoryStore: me.comboTreeCategoryStore }).show(); me.comboTreeCategoryStore.load(); console.log(me.comboTreeCategoryStore.getRootNode()); me.callParent(arguments); } Schau ich hier die Consolen Log an, so habe ich meine Objekt in me.comboTreeCategoryStore. Diese geben ich ja oben eig. an die View weiter. In der View ist aber me.comboTreeCategoryStore unbekannt. Hast du ne Idee?

Hi Daniel, solangsam komme ich dem auf die Spur. kann es sein, dass der Main.js Controller zwei mal die Init Funktion aufruft? Ein mal die Original und ein mal die Überschriebene? Wenn ich nämlich in dem Windows das übergeben Obeject Debugge, so bekomme ich zwei Ausgaben. Bei der ersten Ausgabe ist der Object korrekt enthalten und bei der zweiten Ausgabe ist es undefine.

Hi, schwer zu sagen. Wie überschreibst du den Controller denn? Normalerweise funktioniert das ganz gut, wir benutzen ja nichts anderes in unseren Plugins. Die einzige Schwierigkeit, die ich prinzipiell ausmache, ist hier der Tree - der ist in ExtJS manchmal etwas widerspändstig :). lG Daniel

Hi Daniel, also der Controller liegt hier: /Views/backend/import_export/controller/ott_import_export_extension/main.js er wird in der Boostrap bei der Load Action von Import_Export geladen: if ($args-\>getRequest()-\>getActionName() === 'index') { $view-\>extendsTemplate('backend/import\_export/app.js'); } Und der Inhalt sieht so aus: //{block name="backend/import\_export/controller/main" append} //{namespace name=backend/ott\_import\_export\_extension/main} Ext.define('Shopware.apps.ImportExport.controller.Main.ott\_import\_export\_extension.Main', { override: 'Shopware.apps.ImportExport.controller.Main', /\*\* \* Creates the necessary event listener for this \* specific controller and opens a new Ext.window.Window \* @return void \*/ init: function() { var me = this; me.comboTreeCategoryStore = me.getStore('CategoryForComboTree'); me.mainWindow = me.getView('main.Mainwindow').create({ comboTreeCategoryStore: me.comboTreeCategoryStore }).show(); me.comboTreeCategoryStore.load(); console.log(me.comboTreeCategoryStore.getRootNode()); me.callParent(arguments); } }); //{/block}

Hi, ich glaube, da liegt der Fehler: In der Index-Action wird die Application geladen - also die app.js. Dort spielst du nur deine Erweiterung der app.js ein. Die Smarty-Includes in deiner Erweiterung der app.js verweisen nur auf *neue* Dateien. Erweiterung bestehender Dateien nimmst du in der loadAction vor. Hier lädt die ExtJS-Application die weiteren Bestandteile (wie den Controller) nach. Entsprechend machst du da dann ein extendsTemplate auf deine Controller-Erweiterung, in der wiederum mittels ‘override’ der bestehende Controller überschrieben wird. lG Daniel

Sory, ich hatte dir fälschlicherweise die App.js als Code eingefügt. Das ist quatsch. Da wird der Controller nicht überschrieben. Hier, in der Load Action: //if the controller action name equals "load" we have to load all application components if ($args-\>getRequest()-\>getActionName() === 'load') { $view-\>extendsTemplate( 'backend/import\_export/view/main/ott\_import\_export\_extension/mainwindow.js' ); $view-\>extendsTemplate( 'backend/import\_export/controller/ott\_import\_export\_extension/main.js' ); }

Hi, meinst du den call Parent-Aufruf? Damit wird ja die Methode der Parent-Klasse aufgerufen, die du überschrieben hast - also so gesehen 2 Mal init. Gesendet von meinem HTC One mit Tapatalk

Aber wo liegt jetzt der Fehler? Ich weiß nicht was ich ändern muss, damit das Objekt übergeben wird an die Main.Mainview. Gesendet von meinem iPhone mit Tapatalk