Ich entwickle gerade ein Backend-Plugin, welches bei Artikeln und Varianten eine interne EAN Nummer als zusätzliches Feld anzeigt. Bei dem Artikel selber konnte ich das Feld ohne Probleme einbinden. Bei den Varianten trat dann aber folgendes Problem auf. Ich versuche die Datei ‚shopware\templates_default\backend\article\view\variant\detail.js‘ zu erweitern. Der Pfad zu meiner Datei lautet ‚shopware\engine\Shopware\Plugins\Local\Backend\ArticleInternalEan\Views\backend\article\view\variant\detail.js‘. Jetzt möchte ich gerne die Funktion createRightSettingsContainer überladen um das Feld unter dem für die normale EAN einzufügen. Im Gegensatz zu den Artikeln (Datei: ‚shopware\templates_default\backend\article\view\detail\settings.js‘) bekomme ich hier allerdings einen kompletten ExtJS-Container mit bereits instanzierten Objekten zurück. Wenn ich nun versuche einen temporären Container (mit den gleichen Einstellungen) zu erstellen und mein so erzeugtes Feld in den Rückgabewert der Funktion einzufügen erhalte ich die Fehlermeldung „Uncaught TypeError: Cannot read property ‚id‘ of undefined“. Das von mit erzeugte Objekt hat, wenn ich es in der Konsole ausgeben lasse, auch andere Eigenschaften, als die Objekte des Rückgabewerts. Hat jemand schon Erfahrungen mit dem Erweitern der Varianten-Formulare und kann mir helfen? Meine Funktion sieht so aus: createRightSettingsContainer:function () { var me = this; var container = me.callOverridden(arguments); var tmp\_cont = ''; tmp\_cont = Ext.create('Ext.container.Container', { columnWidth:0.5, defaults: { labelWidth: 155, anchor: '100%', xtype: 'textfield' }, padding: '0 20 0 0', layout: 'anchor', border:false, items: [{ xtype: 'textfield', name: 'internal\_ean', fieldLabel: "{s name=detail/settings/internal\_ean}Interne EAN{/s}" }] }); console.log(tmp\_cont.items.items); //console.log(container.items.items.push(tmp\_cont.items.items[0])); console.log(container.items.items); return container; }
Hi, damit die Erweiterung vernünftig funktioniert musst du folgendes machen: Zuerst die Ordnerstruktur: shopware\engine\Shopware\Plugins\Local\Backend\ArticleInternalEan\Views\backend\article\view\variant\detail.js
Unter „…\Views\backend“ solltest du am besten einen Ordner anlegen der den Namen deines Plugins enthält, da Shopware sonst nicht die Standard „backend\article\view\variant\detail.js“ Datei lädt sondern deine. Da du aber nicht alles neu definieren möchtest (vermute ich mal), legst du hier einfach einen Ordner zwischen „backend“ und „article“ und der Standard wird weiterhin geladen. Um die Erweiterung zu laden: Registriere dich bitte auf folgendem Event: $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Backend\_Article', 'loadBackendModule' );
In der Event Listener Funktion machst du dann folgendes: public function loadBackendModule(Enlight\_Event\_EventArgs $arguments) { $arguments-\>getSubject()-\>View()-\>addTemplateDir( $this-\>Path() . 'Views/' ); //if the controller action name equals "load" we have to load all extended application components. if ($arguments-\>getRequest()-\>getActionName() === 'load') { $arguments-\>getSubject()-\>View()-\>extendsTemplate( 'backend/my\_plugin/article/view/detail/my\_window.js' ); } //if the controller action name equals "index" we have to extend the backend article application //to add our own components to the views[], controllers[], models[] and stores[] arrays of the application if ($arguments-\>getRequest()-\>getActionName() === 'index') { $arguments-\>getSubject()-\>View()-\>extendsTemplate( 'backend/my\_plugin/article/my\_app.js' ); } }
In dem IF: if ($arguments-\>getRequest()-\>getActionName() === 'load') {
lädst du alle Dateien die du überschreibst. Solltest du neue Komponent in die Applikation laden wollen benötigst du folgendes IF: if ($arguments-\>getRequest()-\>getActionName() === 'index')
Hier lädst du eine eigene Applikation Datei für das Backend Module in der du per include deine eigenen ExtJs component einbindest. (Wenn du zum Beispiel eine eigene Grid Komponente geschrieben hast). Hier ein Beispiel um ein eigenes Grid in die Applikation einzubinden: //{block name="backend/article/application" append} //{include file="backend/my\_plugin/article/view/my\_plugin/grid.js"} //{/block}
So würde deine my_app.js aussehen. Um eine Komponente sauber zu überschreiben machst du folgendes: if ($arguments-\>getRequest()-\>getActionName() === 'load') { $arguments-\>getSubject()-\>View()-\>extendsTemplate( 'backend/my\_plugin/article/view/detail/my\_window.js' ); }
Mit dieser If erweitere ich das Fenster der Artikel Detailseite im Backend. Die Datei sieht wie folgt aus: //{block name="backend/article/view/detail/window" append} //{namespace name=backend/article/view/main} Ext.define('Shopware.apps.Article.view.detail.MyWindow', { override: 'Shopware.apps.Article.view.detail.Window', /\*\* \* @Override \* Creates the main tab panel which displays the different tabs for the article sections. \* To extend the tab panel this function can be override. \* \* @return Ext.tab.Panel \*/ createMainTabPanel: function() { var me = this, result; result = me.callParent(arguments); result.add(me.createMyComponent()); return result; },
Durch den folgenden Aufruf: result = me.callParent(arguments);
erhälst du die Rückgabe der Standard Funktion. Wichtig hierbei ist dass das Rückgabe Format (in diesem Beispiel ein Array) gleich bleiben muss da die Rückgabe natürlich einem bestimmten Zweck dient. Hier wird die Rückgabe (ein Array) später als „.items“ verwendet daher muss der Rückgabe Typ auf jeden Fall ein Array sein. Hoffe das hilft dir erstmal weiter Das Prinzip lässt sich auf alle Shopware Backend Component und Funktionen anwenden. Mit freundlichen Grüßen Oliver Denter
Könnt Ihr nicht swagCustomShoeSize als funktionierendes Beispiel wieder online verfügbar machen? http://wiki.shopware.de/Erweiterung-von … l_815.html
Hallo Oliver, erstmal danke für die detaillierte Antwort, auch wenn sie das Problem mit dem Rückgabewert der Funktion ‚createRightSettingsContainer‘ in den Variantendetails nicht beantwortet hat. Ich habe mein Plugin jetzt anhand der von dir erläuterten Grundstrukturen und mit Hilfe des Plugins ‚ExtendBackendExample5‘ überarbeitet. Außerdem bin ich auf die Attribute-Tabellen zur Datenspeicherung ausgewichen, da eine andere Erweiterung der Models (leider) nirgends beschrieben wird. Nun bekomme ich allerdings bei den Artikeldetails das Feld erst gar nicht mehr in das Formular eingefügt (die Varianten habe ich erstmal rausgelassen). Ich tippe hier also auf einen elementaren Fehler, der mir einfach nicht auffallen will. In der Datei ‚templates/_default/backend/article/model/attribute.js‘ ist mir noch folgende Zeile aufgefallen: //{block name="backend/article/model/article/fields"}{/block}
müsste dies nicht (wie bei den anderen Attribut-Models) //{block name="backend/article/model/attribute/fields"}{/block}
heißen? Beim Installieren und Deinstallieren treten sporadisch auch „Communication Error“- und „Uncaught type error: Cannot read property ‚message‘ of undefined“-Fehlermeldungen auf. Diese treten allerdings auch bei dem o. g. ExtendBackendExample5-Plugin auf. Ich benutze Shopware 4.0.3. Um nicht den ganzen Code hier ins Forum posten zu müssen habe ich den Ordner des Plugins gezippt und auf unsere Homepage hochgeladen (ArticleInternalEan.zip). Die Zip enthält einen Ordner ‚Vorher‘ mit dem Ursprungszustand des Plugins (der anhand des nicht mehr verfügbaren SwagCustomerShoeSize-Tutorials erstellt wurde) und einen Ordner ‚Neu‘ mit dem überarbeiteten Plugin.
Okay, dann weiß ich da schonmal Bescheid. Auf meine anderen Fragen habt ihr keine Antwort?