Erweiterung order-line-items

Hallo Leute,

ich habe für Shopware 6 ein Plugin geschrieben um Lieferanten ähnlich wie Hersteller pflegen zu können. Nun möchte ich diese Lieferanten mit order-line-items verbinden. Die Idee war, im inline-edit des data-grid für die Bestellpositionen, ein selectfeld einzubinden um dort den Lieferanten auswählen und speichern zu können. Das scheint aber nicht so einfach möglich zu sein. Ich habe die Componente „sw-order-line-items-grid“ überschrieben und die function „getLineItemColumns“ erweitert um eine neue Spalte anzeigen zu lassen. In den Options habe ich inlineEdit auf true gesetzt und dachte ich kann das Template zur Componente dahingehend erweitern, dass ich dort das single select erstellen und verbinden kann. Leider scheint das aber nicht zu gehen da inline-edit auf „number“, „string“, „boolean“ begrenzt zu sein scheint.

Da das wohl so ist habe ich mir nun eine andere Lösung überlegt. Bei der Erweiterung des data-grid in der function getLineItemColumns habe ich in meiner neuen column die property „inlineEdit“ auf den Wert „number“ gesetzt. Dadurch bekomme ich ein number Feld in welches ich nun eine Nummer eintragen kann, welche dann später für einen Lieferanten steht. Soweit so gut, aber wie bekomme ich jetzt diesen Wert gespeichert ?

Ich habe das neue Feld in welches ich den Wert speichern möchte über eine entity-extension erstellt. Das neue Feld steht hier mit eine oneToOne in Verbindung mit dem order-line-item.

Wenn ich die Doku richtig gelesen habe, wird das neue Feld über die Beziehung der entity-Extension zu den order-line-items im administrationsbereich schon geladen werden und durch die erweiterung der column definition des entsprechenden controllers wird die column dann pflegbar gemacht.

Aber wie bekomme ich jetzt den Wert aus meinem inline-edit-number-field in die Datenbank ?
Wenn ich in der erweiterung der columnDefinition den wert inlineEdit auf „true“ setze bekomme ich eine Fehlermeldung „unknown type true“. Wenn ich den Wert für inlineEdit auf „number“ setze, dann bekomme ich mein number-field zur Pflege aber habe keine Möglichkeit in der column definition anzugeben was der standardwert sein soll oder wo der eingegebene Wert bei Speicherung gespeichert werden soll …

Vielleicht habe ich da auch nur ein Verständnisproblem aber ich habe in der Doku von Shopware6 nichts vergleichbaren gefunden, was hier auf meinen Fall zutrifft und ich bin mit meinem Latein am Ende ?

Der Lieferant muss in unserem Fall an der Bestellposition gesetzt werden können und nicht am Produkt selbst, da wir für ein und den selben Artikel mehrere Lieferanten haben. An der BEstellposition wird dann der Lieferant manuell gesetzt der am schnellsten liefern kann. Da dies bei jeder Bestellung durch einen Mitarbeiter geprüft und anschließend der Lieferant zur Bestellposition manuell gesetzt wird, wäre es unpraktisch, dass am Produkt direkt zu machen.

Für Antworten bedanke ich mich schon einmal im Voraus !

Der Text ist echt lang, ehrlich gesagt habe ich ihn nur überflogen.

In Shopware 6 gibt es nur Hersteller, keine Lieferanten. Sprich, du musst dir selbst ein Lieferanten-Entity erstellen. Soweit ich das gesehen habe, habt ihr das gemacht. Entities in Shopware sind nicht alle auf einer Ebene, teils (un)logisch verschachtelt. So findest du das Hersteller-Entity bspw. im Ordner des Produkt-Entity.

Was ich aus dem letzten Absatz auf die Schnelle lese… Lieferant, Bestellung manuell… Dann solltet ihr ggf. ein Lieferanten-Entity erstellen, dass Unabhängig ist, z.B. wie Hersteller, und das Entity per Extension an die Bestellung bzw. Line-Item binden. Ich kenne den Aufbau nicht auswendig, sollte/ist aber definitiv machbar.

Hi Max_Shop,

Danke für deine Antwort und ja der Text ist lang, war auch schon echt spät gestern :slight_smile: vermutlich deshalb auch nicht so ganz verständlich :slight_smile:

Also wir haben in unserem Plugin schon ein eigenes Entity für die Lieferanten, die sind im Admin auch schon pflegbar. Ich habe auch eine extension des order-line-item entity erstellt um die ID des Lieferanten an das order line item zu verbinden, dass funktioniert soweit auch.

Im Admin Bereich des Shops habe ich die vue.js Datei des data grid für die order-line-items überschrieben um eine zusätzliche Spalte „Lieferant“ einzufügen. Diese wird auch angezeigt.

Jetzt wollte ich das Template der data grid für die order-line-items im Admin erweitern um ein sw-entity-single-select Feld einzufügen, damit man den Lieferanten auswählen kann. Das funktioniert leider nicht und in der shopware Doku ist so eine Erweiterung leider nicht beschrieben.

Muss ich hier im Twig mit einem sw_extends das template überschreiben? Und falls ja, wie speichere ich dann den ausgewählten Lieferanten in die Extension des order line item?

Kennt sich hier vielleicht jemand aus und kann mir bitte weiter helfen ?

Shopware Support äußert sich dazu nicht, denn wir haben zwar eine Professional Edition aber keinen Entwicklersupport …

Ein komplettes Beispiel ist sicherlich nicht beschrieben, aber in Teilen sollte fast alles nachlesbar sein.

Auch dieses Mal wieder… ohne sich lange reinzuversetzen, ist der Sachverhalt nach wie vor kompliziert. Aber ja, wenn du ein neues Select Feld möchtest, dann musst per Twig erweitern „extends“. Entsprechend musst du das Data-Handling per JavaScript selbst übernehmen.

Hi @Max_Shop,

falls du oder irgendjemand anderer das mal braucht. Würde ich hier mal kurz erklären wie ich es nun zum laufen bekommen habe.

Im Prinzip ist es simpel, wenn man mal rausgefunden hat wie es geht. Ich habe nach der Anleitung in den Docs eine Erweiterung des OrderLineItemEntity vorgenommen:

Anschließend habe ich eine Erweiterung des OrderLineItemGrid gemacht und folgendes erweitert:

  1. Die Columns des grids um die Column die ich über die Extension hinzugefügt habe:
getLineItemColumns() {
         [...]
         {
                property: 'supplier.supplierId',
                label: 'Lieferant',
                allowResize: false,
                align: 'right',
                inlineEdit: 'number',
                width: '80px',
            }
          [...]

Da die Extension zwar per autoload geladen werden sollte, aber zu beginn noch leer ist, muss man den entsprechenden Proxy für den API Context selbst hinzufügen. Ich habe also jedem lineItem den entsprechenden Respository-Context zugewiesen als die lineItems geladen wurden, falls der Context noch nicht durch vorhandene Daten vorhanden war:

computed: {
        orderLineItemExtensionRepository() {
            return Service('repositoryFactory').create('wj_order_line_item_extension');
        },

        orderLineItems() {
            for (let i = 0; i < this.order.lineItems.length; i++) {
                if(!this.order.lineItems[i].extensions.supplier){
                    this.order.lineItems[i].supplier = this.orderLineItemExtensionRepository.create(Shopware.Context.api);
                    this.order.lineItems[i].supplier.orderLineItemId = this.order.lineItems[i].id;
                } else {
                    this.order.lineItems[i].supplier = this.order.lineItems[i].extensions.supplier;
                }
            }
            [...]
        }
}

Zum speichern des Wertes aus dem Feld des InlineEdit braucht es noch eine update - Methode um die Daten in die extension zu speichern:

methods: {
        updateSupplier(supplierId, item) {
            item.supplier.supplierId = supplierId;
            item.extensions.supplier = item.supplier;
        }
    }

Im Template wird die Funktion zum Updaten des Datensatzes an der entsprechenden Column - Definition angegeben:

{% block sw_order_line_items_grid_grid_columns_supplier_supplierId %}
                        <template #column-supplier.supplierId="{ item, isInlineEdit }">

                            {% block sw_order_line_items_grid_grid_columns_supplier_supplierId_inline_edit %}
                                <sw-number-field
                                        v-if="isInlineEdit && !itemCreatedFromProduct(item.id)"
                                        v-model="item.supplier.supplierId"
                                        placeholder=0
                                        size="small"
                                        number-type="int"
                                        @change="updateSupplier($event, item)"
                                />
                            {% endblock %}

                            {% block sw_order_line_items_grid_grid_columns_supplier_supplierId_content %}
                                <span v-else>{{ item.supplier.supplierId }}</span>
                            {% endblock %}

                        </template>
                    {% endblock %}

Das wars im Grunde, hat ja nur fast 3 Wochen gedauert das rauszufinden, weil es in keiner Doku behandelt wird.

Have fun with it :wink:

1 „Gefällt mir“