[GELÖST] Wie kann man beim Tab "Einstellungen" einer Einkaufswelt ein eigenes Feld hinzufügen?

Hallo liebe shopware - Gemeinde,

ich würde gerne beim Tab “Einstellungen” einer Einkaufswelt ein weiteres Eingabefeld hinzufügen, beispielsweise unter den Punkt “Aktiv”.

Das entsprechende Feld habe ich natürlich schon erzeugt, es der entsprechenden Attribut-Tabelle bekannt gemacht als auch das Attribut-Model dementsprechend angepasst.

Ich komme nun aber irgendwie nicht bei der settings.js weiter, mein bisheriger Ansatz ist:

//{block name="backend/article/view/detail/settings" append}

Ext.override(Shopware.apps.Emotion.view.detail.Settings, {
	initComponent: function() {
		var me = this;
 
        /* Call the original method and store its result */
        var panelTab = me.callParent(arguments);
		
		topContainer = Ext.create('Ext.container.Container', {
            columnWidth:1,
            defaults: {
                labelWidth: 155,
                anchor: '100%'
            },
            padding: '0 20 0 0',
            layout: 'anchor',
            border:false,
            items:[
				{
					xtype: 'textfield',
					name: 'attribute[attributeField]',
					fieldLabel: '{s name=Test}Test{/s}',
					labelWidth:150,
					allowBlank: true
				}
			]		
        });
		
		/* Create new FieldSet with the new panel inside */
		fieldset = Ext.create('Ext.form.FieldSet', {
            layout: 'column',
            title: '{s name=TestFieldset}TestFieldset{/s}',
			columnWidth:1,
            items: [
                topContainer
			]
		});	
 
        me.activeComboBox.insert(1, fieldset);
 
         return panelTab;
    }
});
//{/block}

Ich habe schon einige Punkte probiert, wo ich das Fieldset einfügen wollte, leider will es nicht funktionieren. Hat jemand einen Tipp, wo oder woran es liegen könnte?

Beste Grüße

Sebastian

Hallo,

hat wirklich noch niemand den Fall gehabt, dass er auch dort eine zusätzliches Eingabefeld benötigt? Kann jemand von Shopware eventuell helfen, [@Stephan Pohl](http://forum.shopware.com/profile/2/Stephan Pohl „Stephan Pohl“)‍ oder [@Daniel Nögel](http://forum.shopware.com/profile/4010/Daniel Nögel „Daniel Nögel“)‍ ? Wäre echt nett.

Beste Grüße

Sebastian

Hi,

wir benutzen dafür eigentlich nie Ext.Override, sondern Ext.define und dazu das ‘override’ property, vgl. http://community.shopware.com/Schuhgrößen-Erweiterung_detail_1052.html#Erweiterung_der_Kundenliste: 

//{block name="backend/customer/view/list/list" append}
//{namespace name="backend/swag_customer_preferences/main"}
Ext.define('Shopware.apps.Customer.view.list.List.customer_preferences.List', {
 
    /**
     * Defines an override applied to a class.
     * @string
     */
    override: 'Shopware.apps.Customer.view.list.List',

Weiterhin machst du am Ende ja ein “activeComboBox.insert()”, um dein CustomFieldset einzufügen; das ist mir nicht ganz geheuer, willst du das nicht eigentlich auf “me.items” machen?

Insgesamt ist das aber auch da im Modul nicht ganz ideal gelöst, weil da im Constructor direkt schon einige Elemente erzeugt werden, und es nicht (wie bei anderen Modulen) eine dedizierte “createActiveComboBox”-Methode gibt. Das führt dazu, dass du direkt die “initComponent” overriden musst - die aber ihrerseits auch schon ein “callParent” macht. Das kann meiner Erfahrung nach auch durchaus für Probleme sorgen, gerade wenn man mit den “xtypes” arbeitet und nicht mit “Ext.create” (wobei das vll. auch eher so esotherisch ist :)). 

Du kannst dir ja erstmal die drei Hinweise ansehen (Override, me.items, Ext.create statt xtypes) - vll. kommst du damit schon weiter.

Daniel 

@Daniel Nögel schrieb:

Hi,

wir benutzen dafür eigentlich nie Ext.Override, sondern Ext.define und dazu das ‚override‘ property, vgl. http://community.shopware.com/Schuhgrößen-Erweiterung_detail_1052.html#Erweiterung_der_Kundenliste

//{block name=„backend/customer/view/list/list“ append}
//{namespace name=„backend/swag_customer_preferences/main“}
Ext.define(‚Shopware.apps.Customer.view.list.List.customer_preferences.List‘, {

/**

  • Defines an override applied to a class.
  • @string
    */
    override: ‚Shopware.apps.Customer.view.list.List‘,

Weiterhin machst du am Ende ja ein „activeComboBox.insert()“, um dein CustomFieldset einzufügen; das ist mir nicht ganz geheuer, willst du das nicht eigentlich auf „me.items“ machen?

Insgesamt ist das aber auch da im Modul nicht ganz ideal gelöst, weil da im Constructor direkt schon einige Elemente erzeugt werden, und es nicht (wie bei anderen Modulen) eine dedizierte „createActiveComboBox“-Methode gibt. Das führt dazu, dass du direkt die „initComponent“ overriden musst - die aber ihrerseits auch schon ein „callParent“ macht. Das kann meiner Erfahrung nach auch durchaus für Probleme sorgen, gerade wenn man mit den „xtypes“ arbeitet und nicht mit „Ext.create“ (wobei das vll. auch eher so esotherisch ist :)). 

Du kannst dir ja erstmal die drei Hinweise ansehen (Override, me.items, Ext.create statt xtypes) - vll. kommst du damit schon weiter.

Daniel 

Hallo Daniel,

danke für dein Feedback. Leider hatte ich das eben auch schon festgestellt, dass das Modul nicht perfekt gelöst ist, um sich per Plugin „einzuklinken“. Und ich will/wollte eben auch nicht die ganze initComponent-Methode überschreiben.

Ich habe es nun erst einmal anders gelöst, ohne extra Eingabefelder bei den Einkaufswelten. Falls jemand aber noch eine Lösung parat hat, bin ich an dieser natürlich interessiert.

Beste Grüße

Sebastian

//{block name="backend/emotion/view/detail/settings" append}
Ext.define('Shopware.apps.Emotion.view.detail.MyPlugin.Settings', {

    /**
     * Defines an override applied to a class.
     * @string
     */
    override: 'Shopware.apps.Emotion.view.detail.Settings',

    /**
     * Overrides the getColumns function of the overridden ExtJs object
     * and inserts two new columns
     * @return
     */
    createTimingFieldSet: function() {
        var me = this;

        var timingFieldset = me.callParent(arguments);

        var myNewField = Ext.create('Ext.form.field.Number', {
            fieldLabel: 'Mein Feld',
            boxLabel: 'Mein Label',
            name: 'attribute[myAttribute]',
            flex: 1
        });

        return {
            xtype: 'container',
            items: [
                myNewField,
                timingFieldset
            ]
        };
    }
});
//{/block}

Ich hatte das mal so gelöst. Einfach die Funktion überschreiben die den Bereich nach dem Feld nach dem du was ergänzen willst erstellt, über callParent die eigentlichen Felder holen, dein eigenes Feld erstellen und beide zurückgeben. Beispiel ist aus einem alten Plugin, kann sein, dass es sich inzwischen etwas geändert hat, aber nach kurzem überfliegen eben würde ich sagen das noch funktioniert. 

Wenn du statt createTimingFieldset() createGeneralFieldSet() nimmst müsste das eigentlich genau das tun was du willst.

Schöner wäre es natürlich wenn auch die ersten Felder aus der init-Funktion in einer eigenen Funktion erstellt werden würden.

1 „Gefällt mir“

@t2oh4e schrieb:

//{block name=„backend/emotion/view/detail/settings“ append}
Ext.define(‚Shopware.apps.Emotion.view.detail.MyPlugin.Settings‘, {

/**

  • Defines an override applied to a class.
  • @string
    */
    override: ‚Shopware.apps.Emotion.view.detail.Settings‘,

/**

  • Overrides the getColumns function of the overridden ExtJs object
  • and inserts two new columns
  • @return
    */
    createTimingFieldSet: function() {
    var me = this;

var timingFieldset = me.callParent(arguments);

var myNewField = Ext.create(‚Ext.form.field.Number‘, {
fieldLabel: ‚Mein Feld‘,
boxLabel: ‚Mein Label‘,
name: ‚attribute[myAttribute]‘,
flex: 1
});

return {
xtype: ‚container‘,
items: [
myNewField,
timingFieldset
]
};
}
});
//{/block}

Ich hatte das mal so gelöst. Einfach die Funktion überschreiben die den Bereich nach dem Feld nach dem du was ergänzen willst erstellt, über callParent die eigentlichen Felder holen, dein eigenes Feld erstellen und beide zurückgeben. Beispiel ist aus einem alten Plugin, kann sein, dass es sich inzwischen etwas geändert hat, aber nach kurzem überfliegen eben würde ich sagen das noch funktioniert. 

Wenn du statt createTimingFieldset() createGeneralFieldSet() nimmst müsste das eigentlich genau das tun was du willst.

Schöner wäre es natürlich wenn auch die ersten Felder aus der init-Funktion in einer eigenen Funktion erstellt werden würden.

Hallo,

danke für den Tipp, ist für meinen Zweck definitiv der bessere Ansatz, als die komplette initComponent-Methode zu überschreiben. Es funktioniert auch wie gewollt, danke für das Teilen deines Wissens und den richtigen Denkanstoß. So ist es auch updatersicher(er). Vielleicht „optimiert“ Shopware in dem Bereich auch nochmal das Modul.

Beste Grüße

Sebastian

Hallo,

 ich konnte bisher herausfiltern, das in der Datei widgets/emotion/index.tpl in der Variable $sEmotions ({foreach $sEmotions as $emotion}) die Attribut-Tabelle (mit einem zusätzlichen Attributfeld) vorhanden ist, in der Datei frontend/home/index.tpl und der Variable $emotions ({foreach $emotions as $emotion}) aber nicht.

Hat jemand eine Idee, wo man da ansetzen könnte, um die Attribut-Tabelle auch in der Variable $emotions verfügbar zu machen? Die Variable wird ja unter engine\Shopware\Components\Emotion in der Datei DeviceConfiguration.php in der get-Funktion befüllt, nur gibt es dort nicht wirklich einen QueryBuilder, den man erweitern könnte.

Beste Grüße

Sebastian

Hallo,

ich habe nun eine für mich funktionierende Lösung gefunden, die vor allem auch updatesicher und ohne Eingriffe in den Core funktioniert.

Zu dem Code von t2oh4e wäre noch anzumerken, dass dieser mit createGeneralFieldSet nicht funktioniert, wenn das Shopware Plugin " Storytelling" aktiviert ist. Aber dafür habe ich auch einen funktionierenden und updatesicheren Workaround gefunden.

Beste Grüße

Sebastian