[Vers. 5.2] Neues Attributsystem und ExtJS

Hallo, ich komme mit dem neuen Attributsystem im ExtJS nicht klar und die Dokumentation (Attribute system) hilft mir ebenfalls nicht weiter.

Kurz zu meinem Problem. Ich habe folgenden Code um in der ArtikelDetail Ansicht ein Attribut als Checkbox auszugeben:

//{block name="backend/article/view/detail/base" append}
//{namespace name=backend/test_attribute_plugin/view/main}
Ext.define('Shopware.apps.TestAttributePlugin.view.detail.Base', {

	override: 'Shopware.apps.Article.view.detail.Base',

	/**
	 * Creates the both containers for the field set
	 * to display the form fields in two columns.
	 *
	 * @return [Array] Contains the left and right container
	 */
	createElements:function () {
		var me = this;

		var result = me.callParent(arguments);

		result[1].add(me.createTestCheckbox());

		return result;
	},

	createTestCheckbox: function() {
		return {
			xtype: 'checkbox',
			name: 'attribute[testIsChecked]',
			fieldLabel: '{s name=detail/base/test_is_checked_label}Is Checked{/s}',
			inputValue: true,
			uncheckedValue:false
		};
	}
});
//{/block}

Mit dieser kleinen Anpassung wurde das Attribut AUTOMATISCH geladen und bei speichern des Produktes auch gespeichert. Nun ist meine Frage wie ich das gleiche Ergebniss mit dem neuen Attributsystem erziele?

Ich habe es wie folgt versucht:

me.attributeForm = Ext.create('Shopware.attribute.Form', {
    table: 's_articles_attributes'
});

me.attributeForm.loadAttribute(me.article.get('id'));

Doch „attributeForm“ ist danach undefined UND ich habe zu der Zeit me.article noch nicht, weil die Stores nicht loaded sind.

Da ich nichtmal dies schaffte, konnte ich auch nicht weitermachen und das Attribut ausgeben in der Checkbox.

Ausserdem ist es wohl nun so, dass dieser Code ebenfalls nicht mehr funktioniert:

//{block name="backend/article/model/attribute/fields" append}
{ldelim}name: 'testIsChecked', type: 'boolean', defaultValue: 0 {rdelim},
//{/block}

Weiß hier jemand eine etwas verlässlichere und besser leserliche Anleitung als die von Shopware selbst? Vor allem mehr meinen Fall betreffend?

Hallo,

dieses Thema beschäftigt sich ausgiebig mit dem Thema des neuen Attributsystems: SW 5.2 - Backend Plugin / eigene Attribute in Artikeldetails - Shopware Community Forum .

Vorweg: wenn deine eigenen Felder variantenfähig sein sollen, bau es am besten wie hier beschrieben um: Attribute system . Damit kannst du es natürlich nicht mehr dort platzieren, wo du es willst, sondern nur im neuen Freitextfelder - Fieldset von Shopware.

Beste Grüße

Sebastian

Ich verstehe!

Ich habe es nun auf den neuen CRUD Service umgebauen und mein ExtJS komplett enfernt, somit wird das Attribut weiter unten angezeigt. Das ist natürlich eine Verbesserung, weil man einiges an Override und Zeilen spart. Mal schauen wie es weiter geht bei mir. In meinem Plugin befülle ich beim Speichern ein Attribut. Sollte ja dann wie hier beschrieben funktionieren: Attribute system

@AWinter schrieb:

Ich verstehe!

Ich habe es nun auf den neuen CRUD Service umgebauen und mein ExtJS komplett enfernt, somit wird das Attribut weiter unten angezeigt. Das ist natürlich eine Verbesserung, weil man einiges an Override und Zeilen spart. Mal schauen wie es weiter geht bei mir. In meinem Plugin befülle ich beim Speichern ein Attribut. Sollte ja dann wie hier beschrieben funktionieren: https://developers.shopware.com/developers-guide/attribute-system/#save-your-attribute-data

Hallo,

das dort beschriebene funktioniert (wie im Thema erwähnt) aber nur bei Hauptartikeln, da es die dort erwähnte Funktion (onStoresLoaded) bei Varianten nicht gibt (die vor dem Laden der Inhalte aufgerufen wird).

Beste Grüße

Sebastian

Das ist kein Problem. Ich brauche dies nur auf dem Hauptartikel.

Was mich aber mehr ärgert ist die Sache, dass die Attribute nicht mehr im Model assoziert sind. Vorher konnte ich ohne Probleme innerhalb des Artikels mit folgendem Code auf die Attribute zugreifen:

me.subApplication.article.getAttributeStore.first()

Doch ich finde nirgends etwas, wie es nun funktioniert. Hängen die Artikelattribute noch an der “article” Application? Auch in themes/Backend/ExtJs/backend/article/view/detail/* konnte ich  auf die schnelle nichts finden.

Nur dies hier ab Zeile 388 in 

        me.attributeForm = Ext.create('Shopware.attribute.Form', {
            table: 's_articles_attributes',
            allowTranslation: false,
            fieldSetPadding: 0,
            translationForm: me.detailForm
        });
        me.detailForm.add(me.attributeForm);

 

@AWinter schrieb:

Das ist kein Problem. Ich brauche dies nur auf dem Hauptartikel.

Was mich aber mehr ärgert ist die Sache, dass die Attribute nicht mehr im Model assoziert sind. Vorher konnte ich ohne Probleme innerhalb des Artikels mit folgendem Code auf die Attribute zugreifen:

me.subApplication.article.getAttributeStore.first()

Doch ich finde nirgends etwas, wie es nun funktioniert. Hängen die Artikelattribute noch an der „article“ Application? Auch in themes/Backend/ExtJs/backend/article/view/detail/base.js konnte ich nichts finden.

Hallo,

nein das dürfte so nicht mehr funktionieren, da ja das Attributsystem neu und anders entwickelt wurde.

Beste Grüße

Sebastian

D.h. anstelle von

me.subApplication.article.getAttributeStore.first()

Muss ich dies nun umbauen auf folgendes:

        Ext.Ajax.request({
            url: '{url controller=AttributeData action=loadData}',
            params: {
                _foreignKey: me.article.get('mainDetailId'),
                _table: 's_articles_attributes'
            },
            success: function(responseData, request) {
                var response = Ext.JSON.decode(responseData.responseText);

                me.attrField.setValue(response.data['__attribute_my_column']);
            }
        });

Und evtl. anstatt den Response per setValue in die Felder eintragen den Response als Models und in ein Store packen.

Habs nun zum laufen gebracht. Das mit in Store packen ging nicht, weil ja Ajax Request Asynchron ist und daher die Fields aufgebaut wurden bevor die Daten vorhanden waren. Das müsste man nun in allen Plugins umbauen. Ist etwas doof gelöst.

@AWinter schrieb:

Habs nun zum laufen gebracht. Das mit in Store packen ging nicht, weil ja Ajax Request Asynchron ist und daher die Fields aufgebaut wurden bevor die Daten vorhanden waren. Das müsste man nun in allen Plugins umbauen. Ist etwas doof gelöst.

Hallo,

was hast du denn alles zum Laufen gebraucht? Nur dass das eigene Freitextfeld wieder lad- und speicherbar ist oder auch die Listenansicht des Feldes (getAttributeStore)?

Beste Grüße

Sebastian

Naja, halb halb :slight_smile:

Ich lade es nun per Ajax, wie es in der Doku steht. Allerdings in der Success funktion befülle ich ein Model und lade es direkt in das Formular mit loadRecord.

	/**
	 * @return void
	 */
	initComponent: function() {
		var me = this;
		me.items = [me.createFormFieldSet()];
		me.callParent(arguments);

        Ext.Ajax.request({
            url: '{url controller=AttributeData action=loadData}',
            params: {
                _foreignKey: me.article.get('mainDetailId'),
                _table: 's_articles_attributes'
            },
            success: function(responseData, request) {
                var response = Ext.JSON.decode(responseData.responseText);
                var configuration = {};
                if(response.data['__attribute_test_configuration'] != null) {
                    configuration = Ext.JSON.decode(response.data['__attribute_test_configuration'], true);
                }
                configuration.articleId = me.article.get('id');
                configuration.mainDetailId = me.article.get('mainDetailId');
                me.loadRecord(Ext.create('Shopware.apps.TestModel.model.test.Configuration', configuration));
            }
        });
	},

Ich habe ein JSON String gespeichert. Dies würde natürlich auch mit mehreren Attributen gehen und diese in das Model laden.

@AWinter schrieb:

Naja, halb halb :)

Ich lade es nun per Ajax, wie es in der Doku steht. Allerdings in der Success funktion befülle ich ein Model und lade es direkt in das Formular mit loadRecord.

/**

  • @return void
    */
    initComponent: function() {
    var me = this;
    me.items = [me.createFormFieldSet()];
    me.callParent(arguments);

Ext.Ajax.request({
url: ‚{url controller=AttributeData action=loadData}‘,
params: {
_foreignKey: me.article.get(‚mainDetailId‘),
_table: ‚s_articles_attributes‘
},
success: function(responseData, request) {
var response = Ext.JSON.decode(responseData.responseText);
var configuration = {};
if(response.data[‚__attribute_test_configuration‘] != null) {
configuration = Ext.JSON.decode(response.data[‚__attribute_test_configuration‘], true);
}
configuration.articleId = me.article.get(‚id‘);
configuration.mainDetailId = me.article.get(‚mainDetailId‘);
me.loadRecord(Ext.create(‚Shopware.apps.TestModel.model.test.Configuration‘, configuration));
}
});
},

Ich habe ein JSON String gespeichert. Dies würde natürlich auch mit mehreren Attributen gehen und diese in das Model laden.

Hallo,

achso, du machst es gleich in der initComponent statt in der onStoresLoaded. Klappt das ganze auch bei den Varianten?

Beste Grüße

Sebastian

Ich habe es hier in der initComponent gemacht, weil dies meine eigene View ist und keine onStoresLoaded Funktionen enthält (diese sind dann bereits im Artikel Modul geladen).

Selbst wenn man die Attribute in der onStoresLoaded Funktion lädt, hat man diese danach NICHT zur Verfügung wegen Asynchronem laden. Normal müsste man nach dem laden der Attribute die inStoresLoaded triggern können.

Bei Varianten habe ich gar nicht darauf geachtet, weil ich das Attribut in meinem eigenen Plugin benötigt habe und nicht in den Varianten.