Einkaufwelten Element mit Block erweitern

Moin, ich stehe vor eine Problem mit den Einkaufswelten. Und zwar habe ich vor, die Komponente „Artikel“ um eine weitere Bezeichnung innerhalb des Dropmenüs zu erweitern. Ich weiß, dass dies in der article_type.js im Verzeichnis emotion/view/components/fields passiert. Dort sind meine Änderungen drin und es funktioniert super. Aber ich will das mit meinem Plugin lösen und nicht in der Core-Datei rumwurschteln. Leider ist in der Datei kein Block sondern lediglich ein Namespace: //{namespace name=backend/emotion/view/components/article} Ext.define('Shopware.apps.Emotion.view.components.fields.ArticleType', { extend: 'Ext.form.field.ComboBox', alias: 'widget.emotion-components-fields-article-type', name: 'article\_type', Konkret handelt es sich um diese Änderung. „radius_value“ ist von mir, also der letzte „Block“ createStore: function() { var me = this, snippets = me.snippets.store; return Ext.create('Ext.data.JsonStore', { fields: ['value', 'display'], data: [{ value: 'selected\_article', display: snippets.selected\_article }, { value: 'newcomer', display: snippets.newcomer }, { value: 'topseller', display: snippets.topseller }, { value: 'random\_article', display: snippets.random\_article }, { value: 'radius\_article', display: snippets.radius\_article }] }); } Ich find den Block indem das alles aufgerufen wird auch nicht. Wäre cool, wenn da mal jmd mit sehr viel Ahnung (auch Shopware darf sich angesprochen fühlen :wink: ) draufgucken könnte. Besten Dank!

Ohne einen smarty block hast du quasi nur eine Möglichkeit. 1.) Überschreibe die Artikel Komponente mit deiner eigenen. 2.) Überschreibe die createStore() Methode 3.) Hole den Rückgabewert vom parent, erweitere den json store entsprechend deinen Vorgaben und gebe den neuen store schließlich zurück. Da ich mir nicht sicher bin, ob du den store zur Laufzeit ändern kannst, musst du evtl. auch einen neuen store erzeugen. Viele Grüße

1 „Gefällt mir“

Vielen Dank schonmal, aber wie kann ich die createStore denn überschreiben? Sie befindet sich nicht in der article.js sondern in article_type.js, welche ja keinen block hat. article.js //{block name="backend/emotion/view/components/article"} //{namespace name=backend/emotion/view/components/article} Ext.define('Shopware.apps.Emotion.view.components.Article', { extend: 'Shopware.apps.Emotion.view.components.Base', alias: 'widget.emotion-components-article', snippets: { article: '{s name=article}Search article{/s}' }, /\*\* \* Base path which will be used from the component. \* @string \*/ basePath: '{link file=""}', /\*\* \* Initiliaze the component. \* \* @public \* @return void \*/ initComponent: function() { var me = this; me.callParent(arguments); me.articleSearch = me.down('emotion-components-fields-article'); me.articleSearch.searchField.setValue(me.articleSearch.hiddenField.getValue()); var value = ''; Ext.each(me.getSettings('record').get('data'), function(item) { if(item.key == 'article\_type') { value = item.value; return false; } }); if(!value || value !== 'selected\_article') { me.articleSearch.hide(); } } }); //{/block} Und die article_type.js //{namespace name=backend/emotion/view/components/article} Ext.define('Shopware.apps.Emotion.view.components.fields.ArticleType', { extend: 'Ext.form.field.ComboBox', alias: 'widget.emotion-components-fields-article-type', name: 'article\_type', /\*\* \* Snippets for the component \* @object \*/ snippets: { fields: { 'article\_type': '{s name=article/fields/article\_type}Type of article{/s}', 'empty\_text': '{s name=article/fields/empty\_text}Please select...{/s}' }, store: { 'selected\_article': '{s name=article/store/selected\_article}Selected article{/s}', 'newcomer': '{s name=article/store/newcomer}Newcomer article{/s}', 'topseller': '{s name=article/store/topseller}Topseller article{/s}', 'random\_article': '{s name=article/store/random\_article}Random article{/s}', 'radius\_article': '{s name=article/store/radius\_article}Radius Artikel{/s}' } }, /\*\* \* Initiliaze the component. \* \* @public \* @return void \*/ initComponent: function() { var me = this; Ext.apply(me, { emptyText: me.snippets.fields.empty\_text, fieldLabel: me.snippets.fields.article\_type, displayField: 'display', valueField: 'value', queryMode: 'local', triggerAction: 'all', store: me.createStore() }); me.callParent(arguments); me.on('change', me.onArticleSelectChange, me); }, /\*\* \* Event listeners which triggers when the user changs the value \* of the select field. \* \* @public \* @event change \* @param [object] field - Ext.form.field.ComboBox \* @param [string] value - The selected value \*/ onArticleSelectChange: function(field, value) { var me = this; // Terminate the article search field if(!me.articleSearch) { me.articleSearch = me.up('fieldset').down('emotion-components-fields-article'); } // Show/hide article search field based on selected entry me.articleSearch.setVisible(value !== 'selected\_article' ? false : true); }, /\*\* \* Creates a local store which will be used \* for the combo box. We don't need that data. \* \* @public \* @return [object] Ext.data.Store \*/ createStore: function() { var me = this, snippets = me.snippets.store; return Ext.create('Ext.data.JsonStore', { fields: ['value', 'display'], data: [{ value: 'selected\_article', display: snippets.selected\_article }, { value: 'newcomer', display: snippets.newcomer }, { value: 'topseller', display: snippets.topseller }, { value: 'random\_article', display: snippets.random\_article }, { value: 'radius\_article', display: snippets.radius\_article }] }); } });

In etwa so: Ext.define( "Shopware.apps.Emotion.view.MeinPlugin.components.fields.ArticleType", { // override the article type override: 'Shopware.apps.Emotion.view.components.fields.ArticleType', // override the method createStore: function() { // get this var me = this; // get parent store var result = me.callParent( arguments ); // do something // ... }, }); Viele Grüße

1 „Gefällt mir“

Vielen Dank, das bekomme ich hin :slight_smile:

ich wollte mal fragen wie ich überhaupt ein Einkaufwelten Element erweitern kann. Ich habe es mit der gleichen Methode wie man zum Beispiel “Artikel Erstellen” erweitert aber so passiert bei mir nichts :confused: public function install(){ $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Backend\_Emotion', 'onPostDispatchBackendEmotion' ); return true; } public function onPostDispatchBackendEmotion(Enlight\_Event\_EventArgs $args) { $args-\>getSubject()-\>View()-\>addTemplateDir($this-\>Path() . 'Views/'); if ($args-\>getRequest()-\>getActionName() === 'index' ) { $args-\>getSubject()-\>View()-\>extendsTemplate('backend/emotion/view/components/article.js'); } }

Sobald eine Antwort drin ist ev. hilfreiche Querverlinkung:
Einkaufswelten / bestehende Elemente erweitern - Shopware Community Forum