Artikelnummer in Association anzeigen

Hallo liebe Forummitglieder,

ich bin noch ziemlich neu in der Programmierung von Backend Plugins. Nun soll der Kunde in einem Plugin verschiedene Artikel auswählen und dazu eine Nummer eingeben können, die dann später auf einem Etikett ausgegeben werden. Dies funktioniert auch bereits allerdings will der Kunde in der Detailansicht die Artikel nicht anhand des Namens, sondern anhand der Artikelnummer auswählen können.

Die Auswahl anhand des Namens habe ich einfach mit folgender Association gelöst:

associations: [{
        relation: 'ManyToOne',
        field: 'articleId',
        type: 'hasMany',
        model: 'Shopware.apps.Base.model.Article',
        name: 'getArticle',
        associationKey: 'article'
    }],

Ist es möglich nun hier statt dem Namen die Artikelnummer auslesen zu lassen?

Viele Grüße

Zunächst ein paar Background-Infos:

Das Article-Model kann mehere Artikelnummern haben. Artikelnummern sind auf Variantenbasis vergeben. Shopware übermittelt jedoch zur Vereinfachung auch die Artikelnummer der Hauptvariante im Article-Model selbst. Wenn dir das reicht und du die Artikelnummern der Varianten irgnorieren kannst (bzw. der Shop keine Varianten hat), kannst du das Article-Model verwenden. Ansonsten solltest du evtl. auf das Variant-Model wechseln.

Nun zum eigentlichen Problem:

Ich nehme mal an, dass du die Shopware Backend-Components nutzt. Eine ManyToOne-Relation wird hier mit einem Combobox-Suchfeld (Shopware.form.field.Search) realisiert. Du kannst wie folgt die Darstellung manipulieren: Backend Components - Detail
Wie du im Tutorial sehen wirst, wird hier aus einem Textfeld ein TinyMCE Editor gemacht (Überschreibung von Attributen). Da wird einfach der xtype geändert. Was du ändern möchtest, ist das displayField (siehe hier). Dann wird aber gar kein Name mehr angezeigt, sondern nur noch die Artikelnummer. Wenn dich das nun auch stört, müsstest du ein eigenes Form-Element erstellen, welches von Shopware.form.field.Search erbt und die Darstellung + Suche entsprechend anpasst.

Viele Grüße

1 „Gefällt mir“

Danke schon mal für die Antwort.

Der Shop hat keine Varianten, weshalb ich die einfachere Möglichkeit anwenden kann. Kannst du mir auch noch sagen, was ich in displayField eintragen muss?
Ich habe es mit number und ordernumber versucht, aber in beiden Fällen ist meine Liste nun leer.

Ext.define('Shopware.apps.CreateLabels.view.detail.Container', {
    extend: 'Shopware.model.Container',
    padding: 20,

    configure: function() {
        return {
            controller: 'CreateLabels',
            fieldSets: [{
                title: 'Label erstellen',
                fields: {
                    articleId:{
                    	fieldLabel:'Artikel',
                    	displayField:'ordernumber'
                    } ,
                    charge: 'Chargennummer'
                }
            }]
        };
    },
});

 

Laut Model müsste number richtig sein ( shopware/article.js at 5.4 · shopware/shopware · GitHub )
Cache auch geleert?

Prüfe doch am besten mal via den Chrome-Developer Tools, was an Shopware übermittelt wird, wenn du in das Feld eine Artikelnummer eingibst und was die Response ist.

Falls dir das nichts hilft, poste diese Dinge hier im Forum.
(Request URL + Übermittelete POST Daten, Response als JSON)

Viele Grüße

(Was auch sein kann: Wenn du die Attribute überschreibst, dass du noch einmal den xtype: shopware-form-field-search angeben musst. Ist das Feld denn noch eine Combobox?)

Request URL:

http://shopware.hwcomputersolutions.de/demo2/backend/CreateLabels/searchAssociation?_dc=1531127803527&query=&association=article&page=1&start=0&limit=25

Response: Hier habe ich ein paar Produkte rausgelöscht, damit es nicht zu lang wird. Scheinbar sind diese aber vorhanden. Nur gibt es keinen Number Wert, der angezeigt werden kann.

{"success":true,"data":[{"id":2,"mainDetailId":2,"supplierId":15,"taxId":6,"priceGroupId":3,"filterGroupId":null,"configuratorSetId":null,"name":"Imagebrosch\u00fcre - Chinesisch","description":"in China gedruckt. \u00dcber FRCC Roy Li","descriptionLong":"Ein \u00dcberblick \u00fcber die wichtigsten Produkte und Dienstleistungen DIN A4","added":new Date(1526508000000),"active":true,"pseudoSales":0,"highlight":false,"keywords":"","metaTitle":"","changed":new Date(1526564187000),"priceGroupActive":true,"lastStock":false,"crossBundleLook":0,"notification":false,"template":"","mode":0,"availableFrom":null,"availableTo":null},{"id":18,"mainDetailId":18,"supplierId":15,"taxId":6,"priceGroupId":3,"filterGroupId":null,"configuratorSetId":null,"name":"Fotobuch Welcome Package - Englisch (US) ","description":"Inhaltlich identisch mit FRE1003EN; Formatadaption im Letter-Format","descriptionLong":"welcome book, Fotobuch als Bestandteil des Welcome-Packages","added":new Date(1526508000000),"active":true,"pseudoSales":0,"highlight":false,"keywords":"","metaTitle":"","changed":new Date(1526568502000),"priceGroupActive":true,"lastStock":false,"crossBundleLook":0,"notification":false,"template":"","mode":0,"availableFrom":null,"availableTo":null},{"id":26,"mainDetailId":26,"supplierId":15,"taxId":6,"priceGroupId":3,"filterGroupId":null,"configuratorSetId":null,"name":"Werte & Grunds\u00e4tze - Tschechisch","description":"","descriptionLong":"Die Leits\u00e4tze und ihre Erl\u00e4uterungen (\u0084Handeln und Verhalten\u0093) sind die Grundlage f\u00fcr alle anderen.DIN A5 - mit Einleger \"Leits\u00e4tze\"","added":new Date(1526508000000),"active":true,"pseudoSales":0,"highlight":false,"keywords":"","metaTitle":"","changed":new Date(1526568502000),"priceGroupActive":true,"lastStock":false,"crossBundleLook":0,"notification":false,"template":"","mode":0,"availableFrom":null,"availableTo":null}],"total":301}

 

So ein Mist aber auch, Shopware übergibt hier tatsälich keine Ordernumber. Dann würde ich dir empfehlen das Variant-Model (Shopware.apps.Base.model.Variant) zu verwenden. Dies hat auf alle Fälle ein Feld names order number. => Die Association entsprechend anpassen. Eine Bestellnummer hängt nunmal an einem Artikel-Detail und nicht am Article selbst. Das sieht man auch an der Datenbank (keine ordernumber in s_articles nur in s_articles_details). Auch bei nicht Varianten-Artikeln.

Nachteil: du hast keine direkte Referenz auf die ID des Hauptartikels. Eigentlich sollte dies aber kein Nachteil sein, da zumindest im Frontend eigentlich fast ausschließlich mit Artikelnummern gearbeitet wird. (siehe ProductNumberService)

Viele Grüße

edit: Nur zur Klarstellung: Ein Nicht-Varianten Artikel ist bei Shopware einfach ein Artikel mit nur einer Variante. (= Hauptvariante)

Ich habe nun die beiden Dateien folgendermaße abgeändert. Leider ist das ganz immernoch leer, bzw. wird die nummer nicht angezeigt.

Ext.define('Shopware.apps.CreateLabels.view.detail.Container', {
    extend: 'Shopware.model.Container',
    padding: 20,

    configure: function() {
        return {
            controller: 'CreateLabels',
            fieldSets: [{
                title: 'Label erstellen',
                fields: {
                    articleId:{
                    	fieldLabel:'Artikel',
                    	displayField:'ordernumber',
                    	xtype: 'shopware-form-field-search'
                    } ,
                    charge: 'Chargennummer'
                }
            }]
        };
    },
});


Ext.define('Shopware.apps.CreateLabels.model.Etiketten', {
    extend: 'Shopware.data.Model',

    configure: function() {
        return {
            controller: 'CreateLabels',
            detail: 'Shopware.apps.CreateLabels.view.detail.Container'
        };
    },


    fields: [
        { name : 'id', type: 'int', useNull: true },
        { name : 'articleId', type: 'string', useNull: false },
        { name : 'charge', type: 'string', useNull: false },
    ],
    
     associations: [{
        relation: 'ManyToOne',
        field: 'articleId',
        type: 'hasMany',
        model: 'Shopware.apps.Base.model.Variant',
        name: 'getArticle',
        associationKey: 'article'
    }],
    
});

Mache ich hier noch etwas falsch?

Wenn du deinen eigenen Controller verwendest, hast du auch folgendes gemacht?

https://developers.shopware.com/developers-guide/backend-components/associations/#extend-the-php-controller

Dann kannst du evtl. doch das Artikelmodel verwenden. Du musst halt nur die Ordernumber der Variante selbst noch selektieren. Wie sieht denn der Code von dem Controller aus?

Viele Grüße

Der Controller sieht folgendermaßen aus:

leftJoin('etiketten.article', 'article');

        $builder->addSelect(array('article'));

        return $builder;
    }
}

und das dazugehörige Model so:

id;
    }
	
	public function getArticle()
    {
        return $this->article;
    }

    public function setArticle($article)
    {
        $this->article = $article;
        return $this;
    }

	public function getCharge()
    {
        return $this->charge;
    }

    public function setCharge($charge)
    {
        $this->charge = $charge;
    }
    

}

 

Ok, dann ändere in deinem EXTJS Code doch alles wieder auf das Article-Model (weg vom Variant-Model) und füge folgendes im Controller hinzu:

// ...
protected function getDetailQuery($id)
{
    $builder = parent::getDetailQuery($id);

    $builder->leftJoin('etiketten.article', 'article');
    $builder->leftJoin('article.mainDetail', 'detail'); // die ordernumber steht ja in den details

    $builder->addSelect(array('article','detail.ordernumber as number'));

    return $builder;
}
// ...

Ich habe das jetzt nicht getestet, aber so in etwa müsste es klappen. Vorhin war natürlich die „number“ nicht dabei, da du sie ja gar nicht selektiert hast. Wink