Guten Morgen, auf Basis von http://wiki.shopware.de/Einsteiger-Schu … 2_871.html versuche ich beim Bankeinzug 2 Felder zu erweitern. Die Felder sind vorhanden, aber es besteht keine Zuordnung und wird nichts gespeichert/abgefragt. Habe ich was Grundlegendes vergessen? Ich komme einfach nicht dahinter? Danke Evtl. habt ihr mir einen Tipp. Bootstrap: public function install() { try { $this-\>subscribeEvents(); $this-\>createAttributes(); } catch (Exception $e) { return array( 'success' =\> false, 'message' =\> $e-\>getMessage() ); } return true; } /\*\* \* Registers all necessary events and hooks. \*/ private function subscribeEvents() { $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Backend\_Customer', 'onBackendCustomerPostDispatch' ); $this-\>subscribeEvent( 'Shopware\Models\Customer\Repository::getCustomerDetailQueryBuilder::after', 'aftergetCustomerDetailQueryBuilder' ); } /\*\* \* create additional attributes in s\_user\_attributes and re-generate attribute models \*/ private function createAttributes() { $this-\>Application()-\>Models()-\>addAttribute( 's\_user\_attributes', 'ott', 'feld\_eins', 'varchar(50)', true, null ); $this-\>Application()-\>Models()-\>addAttribute( 's\_user\_attributes', 'ott', 'feld\_zwei', 'varchar(50)', true, null ); $this-\>getEntityManager()-\>generateAttributeModels(array( 's\_user\_attributes' )); } /\*\* \* Hooks the getListQueryBuilder method of the customer repository. \* Additionally selects our own attributes \* \* @param Enlight\_Hook\_HookArgs $arguments \*/ public function aftergetCustomerDetailQueryBuilder(Enlight\_Hook\_HookArgs $arguments) { // get original builder $builder = $arguments-\>getReturn(); // add selection and join to original builder $builder-\>addSelect(array( 'attributes.ottFeldEins', 'attributes.ottFeldZwei' )); $builder-\>leftJoin('customer.attribute', 'attributes'); $arguments-\>setReturn($builder); } /\*\* \* Called when the BackendCustomerPostDispatch Event is triggered \* \* @param Enlight\_Event\_EventArgs $args \*/ public function onBackendCustomerPostDispatch(Enlight\_Event\_EventArgs $args) { /\*\*@var $view Enlight\_View\_Default\*/ $view = $args-\>getSubject()-\>View(); // Add snippet directory $this-\>Application()-\>Snippets()-\>addConfigDir( $this-\>Path() . 'Snippets/' ); // Add template directory $args-\>getSubject()-\>View()-\>addTemplateDir( $this-\>Path() . 'Views/' ); //if the controller action name equals "load" we have to load all application components if ($args-\>getRequest()-\>getActionName() === 'load') { $view-\>extendsTemplate( 'backend/customer/model/ott\_test/attribute.js' ); $view-\>extendsTemplate( 'backend/customer/view/detail/ott\_test/debit.js' ); }
Code: backend/customer/model/ott_test/attribute.js //{block name="backend/customer/model/attribute/fields" append} { name:'ottFeldEins', type:'string' }, { name:'ottFeldZwei', type:'string' }, //{/block}
Code: backend/customer/view/detail/ott_test/debit.js //{block name="backend/customer/view/detail/debit" append} //{namespace name="backend/ott\_sepa\_fields/main"} Ext.define('Shopware.apps.Customer.view.detail.Debit.sepa\_fields.Debit', { /\*\* \* Defines an override applied to a class. \* @string \*/ override: 'Shopware.apps.Customer.view.detail.Debit', /\*\* \* Creates the form elements for the left container. \* \* @return [Array] Contains the account name and account holder \*/ createDebitFormLeft:function () { var me = this; return [{ name:'debit[account]', alias:'account', fieldLabel:me.snippets.account }, { name:'debit[accountHolder]', alias:'holder', fieldLabel:me.snippets.accountHolder }, { name:'attributes[ottFeldEins]', alias:'feldeins', fieldLabel:'FeldEins' }]; }, /\*\* \* Creates the form elements for the right container. \* \* @return [Array] Contains the bank name and code \*/ createDebitFormRight:function () { var me = this; return [{ name:'debit[bankName]', alias:'bankName', fieldLabel:me.snippets.bankName }, { name:'debit[bankCode]', alias:'bankCode', fieldLabel:me.snippets.bankCode }, { name:'attributes[ottFeldZwei]', alias:'feldzwei', fieldLabel:'Feldzwei' }]; } }); //{/block}
ist nun gelöst! ich habe die Feldzuordung über name: ‚attributes[meinFeld]‘ es muss aber heißen: name: ‚attribute[meinFeld]‘ Warum ist mir schleierhaft? Die Bekanntmachung ist doch so // add selection and join to original builder $builder-\>addSelect(array( 'attributes.ottDebitBic', 'attributes.ottDebitIban' )); $builder-\>leftJoin('customer.attribute', 'attributes');
Also auch attributes… !
Mh, gute Frage. Eventuell schlägt dein Join auch fehl. Shopware joint ja selbst schon komplett customer.attribute (und auch unter dem Namen “attribute”) und (Doctrine) merkt, dass du das selbe noch mal tun möchtest. Probier mal ob du dir deinen Hook da nicht komplett sparen kannst.
[quote=„haruka“]Mh, gute Frage. Eventuell schlägt dein Join auch fehl. Shopware joint ja selbst schon komplett customer.attribute (und auch unter dem Namen „attribute“) und (Doctrine) merkt, dass du das selbe noch mal tun möchtest. Probier mal ob du dir deinen Hook da nicht komplett sparen kannst.[/quote] Könnte sein. Aber im Beispiel von SW machen Sie es ja genau gleich. Joinen mit attributes und der aufruf nachher geht mit attribute. Komisch… Hauptsache es geht nun Danke
Jetzt habe ich noch eine Frage. Die Kundendetailserweiterung habe ich hinbekommen. Diese wird in die Attributfelder der Kunden hinterlegt. Nun will ich diese Info auch in der Bestellübersicht anzeigen. $this-\>subscribeEvent( 'Shopware\Models\Order\Repository::getOrdersQueryBuilder::after', 'aftergetOrdersQueryBuilder' );
public function aftergetOrderDetailQueryBuilder(Enlight\_Hook\_HookArgs $arguments) { // get original builder $builder = $arguments-\>getReturn(); // add selection and join to original builder $builder-\>addSelect(array( 'customerAttributes.ottDebitBic', 'customerAttributes.ottDebitIban' )); $builder-\>leftJoin('customer.attribute', 'customerAttributes'); $arguments-\>setReturn($builder); }
/\*\* \* Called when the BackendOrderPostDispatch Event is triggered \* \* @param Enlight\_Event\_EventArgs $args \*/ public function onBackendOrderPostDispatch(Enlight\_Event\_EventArgs $args) { /\*\*@var $view Enlight\_View\_Default\*/ $view = $args-\>getSubject()-\>View(); // Add snippet directory $this-\>Application()-\>Snippets()-\>addConfigDir( $this-\>Path() . 'Snippets/' ); // Add template directory $args-\>getSubject()-\>View()-\>addTemplateDir( $this-\>Path() . 'Views/' ); //if the controller action name equals "load" we have to load all application components if ($args-\>getRequest()-\>getActionName() === 'load') { $view-\>extendsTemplate( 'backend/order/model/sepa\_fields/debit.js' ); $view-\>extendsTemplate( 'backend/order/view/detail/sepa\_fields/debit.js' ); } }
Für die Elemente nutze ich dann: name:‘customerAttributes[ottDebitIban]’ Und die Felder hänge ich hier an: //{block name=“backend/order/model/debit/fields” append} { name:‘ottDebitBic’, type:‘string’ }, { name:‘ottDebitIban’, type:‘string’ }, //{/block} Fraglich ist nun für mich ob der Name der richtige ist. Da ich ja oben schon das Problem hatte: name:‘customerAttributes[ottDebitIban]’ Und dann ob es überhaupt geht, wenn ich die Cusomter Felder in debit fields anhänge?? Über ein paar Tipps bin ich dankbar.