Ich würde gerne das Formular zum Bearbeiten eines Herstellers via Plugin zu erweitern. Allerdings habe ich das Gefühl, dass es hier einen, mir leider nicht bekannten, Trick gibt. Ich habe den Plugin-Aufbau und die Syntax aus meinen anderen Plugins übernommen und das Event und die Dateinamen entsprechend angepasst, nur leider funktioniert es nicht. Das Attribut wird in der Datenbank angelegt, das Formularfeld erscheint jedoch nicht. (Es kommen später noch mehr Felder hinzu, was aber im Moment erstmal egal ist.) In meiner Bootstrap.php steht folgender Code: public function install() { Shopware()-\>Models()-\>addAttribute( 's\_articles\_supplier\_attributes', 'fome', 'brand\_shop', 'TINYINT(1)', false, 0 ); Shopware()-\>Models()-\>generateAttributeModels( array('s\_articles\_supplier\_attributes') ); $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Backend\_Supplier', 'postDispatchSupplier' ); return array('success' =\> true, 'invalidateCache' =\> array('backend')); } ... public function postDispatchSupplier(Enlight\_Event\_EventArgs $args) { $args-\>getSubject()-\>View()-\>addTemplateDir( $this-\>Path() . 'Views/' ); if ( $args-\>getRequest()-\>getActionName() === 'load' ) { $args-\>getSubject()-\>View()-\>extendsTemplate( 'backend/fome\_brand\_shop/supplier/model/attribute.js' ); $args-\>getSubject()-\>View()-\>extendsTemplate( 'backend/fome\_brand\_shop/supplier/view/main/edit.js' ); } }
Die edit.js enthält den folgenden Code: //{block name="backend/supplier/view/main/edit" append} Ext.override(Shopware.apps.Supplier.view.main.Edit, { getFormTopPart : function() { var me = this, fields = me.callParent(arguments); fields.push({ xtype : 'checkbox', name : 'attribute[fomeBrandShop]', anchor : '95%', value: 0, fieldLabel : 'Markenshop' }); return fields; } }); //{/block}
Eine attribute.js gibt es ebenfalls, die enthält aber auch nur den Standard-Smarty-Code zum Erweitern des Blocks. Im Grunde also nichts besonderes. So wie ich das erkennen konnte, ist ein Unterschied bei den Herstellern, dass die ‚Load-Action‘ nur ausgeführt wird, wenn die Hersteller-Liste aufgerufen wird. Nicht wie z.B. bei den Artikeln wenn man das Bearbeitungs-Formular aufruft. Aber eigentlich sollte es ja keine Rolle spielen, wann die Formular-Dateien geladen werden. Da ich mir nicht vorstellen konnte, dass es an der Syntax oder der Struktur an sich liegt, habe ich spontan via Copy & Paste das Formular der Bestellungsdetails (der Grund für dieses Formular war lediglich, dass ich damit bisher noch gar nichts gemacht hatte) erweitert und dort funktionierte alles einwandfrei.
Hat denn wirklich niemand bisher die Hersteller erweitert oder ein Idee wodran es liegen könnte? :shopware:?
Ich bin gerade an dem selben Problem. Vom Ansatz her hab ich mich an dem Plugin “zusätzliche Artikelattribute” von shopware selbst orientiert. Die Hersteller haben ja bereits die Tabelle s_articles_supplier_attributes - welche sich natürlich anbietet die Erweiterung dort einzügen. Vom Model klappt das auch Prima - die Spalten werden wie geplant erzeugt, nur auch bei mir erscheinen die Attributsfelder nicht beim Hersteller bearbeiten. In der Install-Methode hab ich geschrieben: $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Backend\_Supplier', 'postDispatchBackendSupplier');
die dazugehörige Methode lautet dann: public function postDispatchBackendSupplier(Enlight\_Event\_EventArgs $args) { $request = $args-\>getSubject()-\>Request(); $view = $args-\>getSubject()-\>View(); if($request-\>getActionName() != "load"){ return; } $view-\>addTemplateDir($this-\>Path().'Views/'); $view-\>extendsTemplate('backend/myattributes/supplier/model/attribute.js'); }
Die attribute.js enthält den üblichen Block zur Erweiterung - der schaut korrekt aus. Als ActionName wird “getSuppliers” getriggert. Jedoch nur wenn ich einen Hersteller bearbeite. Bei Neuanlage wird kein Event angestoßen (zumindest kein PostDispatch). Hab auch schon mal den “return” entfernt - kommen trotzdem keine Felder im Bearbeitungsfenster Ich bekomme aber so oder so niemals die neuen zusätzlichen Felder angezeigt. Irgend eine Idee was dies sein kann?
Nach langem Suchen, bin ich an der offensichtlichsten Stelle fündig geworden. Die Smarty-Blöcke sind in den Template-Dateien fehlerhaft eingetragen. Sämtliche Bezeichnungen sind hier ohne doppelte Anfürhungszeichen, also z.B. view/main/edit.js: //{block name=backend/supplier/view/main/edit}
statt //{block name="backend/supplier/view/main/edit"}
Nach dem Einfügen der Anführungszeichen lässt sich der entsprechende Block auch erweitern. Da hiervon sämtliche Dateien der Hersteller (mit Ausnahme der Models) betroffen sind, habe ich ein Ticket im Jira erstellt (http://jira.shopware.de/Widgets/Jira/?ticket=SW-5190).
Das mit dem Smarty-Blöcken stimmt - jetzt kommen auch bei mir meine Felder Allerdings bin ich jetzt beim nächsten Problem. Bei mir kommt beim Speichern jetzt folgende Fehlermeldung: Fatal error: Call to undefined method Shopware\Models\Attribute\ArticleSupplier::setSupplier() in /www/shopware/wwwdoc/engine/Shopware/Components/Model/ModelEntity.php on line 141 503 Service Unavailable bzw. im ErrorLog PHP Fatal error: Call to undefined method Shopware\\Models\\Attribute\\ArticleSupplier::setSupplier() in /www/shopware/wwwdoc/engine/Shopware/Components/Model/ModelEntity.php on line 141
Werde versuchen den Fehler zu finden - falls jemand vorher eine zündende hilfreiche Idee hätte - wäre für jeden Tipp dankbar.
Hab grad gesehen, dass es hierzu bereits ein Ticket gibt und das sogar für die nächste 4.0.7. Version eingeplant ist. Werde also ggf. mal GIT beobachten ob diese Änderung dort schon früher vorhanden ist. Jira Ticket
Kann es sein, dass die Attribute bei den Herstellern generell nicht richtig funktionieren? Sobald ein Hersteller einen Eintrag in der Tabelle ‘s_articles_supplier_attributes’ hat, ist es (zumindest bei mir) nicht mehr möglich ihn zu bearbeiten bzw. die vorgenommenen Änderungen zu speichern. Shopware meldet lediglich ‘Hersteller erfolgreich gespeichert’, aber übernommen wurde nichts. Dies passiert sowohl mit, als auch ohne mein eigenes Plugin. Da ich keine Möglichkeit gefunden habe, wie ich den Herstellern über das Backend neue Freitextfelder zuordnen kann, konnte ich diese Methode leider nicht testen. Hat evtl. noch jemand solche Probleme?