Neues Attribut-System in 5.2 / Bestell-Attribute in ExtJS

Hallo shopware Gemeinde,

für ein Plugin-Update bräuchte ich Eure Unterstützung zu dem neuen Attribut-System. Konkret geht es um die Erweiterung der Bestellübersicht, dort soll nach einem order attribute gefiltert werden und das Attribut soll in der Übersicht aufgeführt werden.

Für shopware 5.1 habe ich das bisher so gelöst:

Auszug aus list.js

    getColumns: function() {
        var me = this;		

        var columns = me.callOverridden(arguments);

        var meineSpalte = {
            header: 'Spaltenname',
            dataIndex:'attribute[mein_neues_Attribut]',
            flex: 1,
            sortable: true,
            renderer: function (p,v,r) {	            
                return me.meineRenderMethode(r.getAttributesStore.data.items[0].raw.meinNeuesAttribut);
            }
            
        };
        
        

        return Ext.Array.insert(columns, 10, [meineSpalte]);
    },

 

Auszug aus filter.js

	override: 'Shopware.apps.Order.view.list.Filter',
    
    createFilterForm: function() {
        var me = this;       

		var filterForm = me.callOverridden(arguments);
		
		filterForm.add(me.createNewField());
		
        return filterForm;
    },    
    
    createNewField: function() {
        var me = this;
        
		return Ext.create('Ext.form.field.ComboBox', {
			xtype: 'combobox',
			flex: 1,
			name: 'attribute.meinNeuesAttribut',
			emptyText: me.snippets.empty,
			fieldLabel: 'Spaltenname',
			valueField: 'name',
			displayField: 'description',
			queryMode: 'local',
			mode: 'local',
			required: false,
			editable: false,
			allowBlank: true,
			store: me.meinStore
		});        

    }    

 

Vielleicht hat jemand ein Code-Beispiel wie ich das für shopware 5.2 lösen kann?

Ich bekomme das attributeForm via “me.attributeForm.loadAttribute(record.get(‘id’));” geladen, mir ist jedoch nicht ganz klar, wie ich den Wert auslesen kann, um diesen beispielsweise an den Renderer weiter zugeben.

Vielen Dank für Eure Hilfe!

Beste Grüße

 

Pascal

Hat niemand eine Idee? Foot-in-Mouth

Die unnötigste Baustelle seit es Shopware 5.2 gibt.

Siehe hier:
Attribute system

Für die list.js habe ich jetzt einen Weg gefunden. Für die filter.js allerdings noch nicht.

Ich weiß nicht, auf was der Querybilder anspringt.
Hat jemand eine Idee, welchen Namen ich für das Attribute verwenden muss, damit das korrekte SQL-Statement erzeugt wird?
In shopware 5.1 war das mit  „attribute.meinNeuesAttribut“ kein Problem…

@site-concept schrieb:

Für die list.js habe ich jetzt einen Weg gefunden. Für die filter.js allerdings noch nicht.

Ich weiß nicht, auf was der Querybilder anspringt.
Hat jemand eine Idee, welchen Namen ich für das Attribute verwenden muss, damit das korrekte SQL-Statement erzeugt wird?
In shopware 5.1 war das mit  “attribute.meinNeuesAttribut” kein Problem…

Hallo,

wie sieht denn deine list.js - Lösung aus?

Beste Grüße

Sebastian

Schließe mich an. Bräuchte auch eine lösung für die list.js. Das Feld wird zwar angezeigt ist aber immer leer, da er den Wert des Attributes nicht lädt.

Hallo,

bisher lade ich den Inhalt über einen Ajax-Request, ist sicherlich nicht die optimalste Lösung…

Wenn Ihr „attribute_name“ gegen euer Attribut ersetzt, solltet Ihr etwas angezeigt bekommen:

getColumns: function() {
    var me = this;		

    var columns = me.callOverridden(arguments);

    var column_attribute_name = {
        header: 'Titel/Überschrift',
        dataIndex:'attribute_name',
        flex: 1,
        sortable: true,
        renderer: function (value, metaData, record) {				
			me.attributeForm = Ext.create('Shopware.attribute.Form', {
			    table: 's_order_attributes',
			    columnName: 'attribute_name'
			});
			
			me.attributeForm.loadAttribute(record.get('id'));
			var attributeName;
			Ext.Ajax.request({
				url: '{url controller=AttributeData action=loadData}',
				params: {
				    _foreignKey: record.get('id'),
				    _table: 's_order_attributes'
				},
				async: false,
				success: function(responseData, request) {
				    var response = Ext.JSON.decode(responseData.responseText);
				    attributeName = response.data.__attribute_attribute_name;
				}
			});				
			return attributeName;
        }
    };
    
    return Ext.Array.insert(columns, 11, [column_attribute_name]);
},

Hätte sonst noch jemand einen Hinweis für die filter.js?

Eventuell kann ja aus dem shopware Lager jemand ein Beispiel bringen?

 

Viele Grüße

 

Pascal

2 Likes

Ist die AJAX Lösung wirklich Best Practise?

Wenn man z.B. 50 Bestellungen in der Übersicht anzeigt, so wird 50 mal der Request gestartet um an alle Attributfelder zu kommen.
Das dauert ewig.

Gibt es ein Beispiel von Shopware wie man eigenen Attribute in das Bestelllisting holt?
Im Grunde kann man ja nun kinderleicht eigenen Attribute über das Backend anlegen, diese sollten dann aber nicht nur in der Hauptmaske / Detail sein, sondern auch im Listing mit angezeigt werden. So wie in der Artikelübersicht. Da geht es ja auch.

Nein ist es leider nicht. Das ist genau der Grund, warum es aktuell auch wieder raus geflogen ist, die Anzahl der Requests macht die Bestellübersicht sehr langsam.

Leider ist mir aktuell keine Alternative bekannt. Wäre schön, wenn shopware sich da mal zu äußern würde, wie das gedacht ist.

ich habe noch einen anderen Weg gefunden. Dieser ist auf jeden Fall performanter.
Probiere es mal aus und gib mir Feedback.

Boostrap.php
 

public function onPostDispatchBackendOrder(Enlight_Event_EventArgs $args)
    {
        $args->getSubject()->View()->addTemplateDir(
            $this->Path() . 'Views/'
        );

        $view = $args->getSubject()->View();
        $assignedData = $view->getAssign('data');

        // if the controller action name equals "load" we have to load all application components.
        if ($args->getRequest()->getActionName() === 'load') {

            $args->getSubject()->View()->extendsTemplate('backend/order/ott_article_config_tab/view/list.js' );
            $args->getSubject()->View()->extendsTemplate('backend/order/ott_article_config_tab/model/productdate.js');
        } elseif($args->getRequest()->getActionName() === 'getList') {
            foreach($assignedData as $key => $order) {
                $assignedData[$key]["ott_project_date"] = Shopware()->Db()->fetchOne('SELECT IFNULL((SELECT ott_project_date FROM s_order_attributes WHERE orderID = ?),"")', array ($order["id"]));
            }

            $view->data = $assignedData;
        }
    }

//Für die Sortierung
public function aftergetBackendOrdersQueryBuilder(Enlight_Hook_HookArgs $arguments)
    {

        $builder = $arguments->getReturn();
        $orderBy = $arguments->get('orderBy');

        $builder->addSelect('attribute');
        $builder->leftJoin('orders.attribute', 'attribute');

        if ("orders.ott_project_date" == $orderBy[0]['property']) {

            if ($orderBy[0]['direction'] == 'ASC') {
                $builder->OrderBy('attribute.ottProjectDate', 'ASC');
            } else {
                $builder->OrderBy('attribute.ottProjectDate', 'DESC');
            }

        }

        $arguments->setReturn($builder);

    }

Model -> productdate.js

//{block name="backend/order/model/order/fields" append}
{ name:'ott_project_date', type:'string' },
//{/block}

 

View -> list.js
 

//{namespace name=backend/order/ott/main}
//{block name="backend/order/view/list/list" append}

Ext.define('Shopware.apps.Order.view.order.ott_list.List', {

    override: 'Shopware.apps.Order.view.list.List',

    getColumns:function () {

        var me = this;
        var columns = me.callOverridden(arguments);

        var column_attribute_name = {
            header: 'Projekt Datum/Uhrzeit',
            dataIndex: 'ott_project_date',
            flex: 1,
            sortable: true,
        };

        return Ext.Array.insert(columns, 1, [column_attribute_name]);
    },

});

//{/block}

 

4 Likes