Neue Felder in Tabelle s_order beim Bestellvorgang befüllen?

[quote=„Stefan Hamann“]Ja, das ist okay - habe schon drüber geschaut und auch ein paar problematische Stellen gefunden - schicke dir Morgen früh eine lauffähige Version.[/quote] Hab recht vielen Dank, ich bin mit fast allem gut klar gekommen, habe immer über Google oder wie auch immer Lösungsansätze gefunden und auch hier die Doku half mir immer weiter, grad was auch das Verständnis des Event und Hook Handlings angeht, aber das im Backend habe ich nicht gepackt bekommen. Nochmals vielen Dank.

Hallo Daniel, habe dir gerade die korrigierte Version des Plugins geschickt. Für alle anderen gibt es die Lösung hier in unserem Gist-Verzeichnis: http://wiki.shopware.de/shopware.php?sViewport=gist

2 „Gefällt mir“

Hallo Stefan, wo hast du das denn hin geschickt? Als Email kam nichts an. Gruß Daniel

An webdesign-.......@gmx.de Habe es jetzt gerade nochmal geschickt

Hallo Zusammen, der Code auf Gist ist spitze. Genau das was ich gesucht hab. Allerdings ist mir ein Fehler aufgefallen. Die overview.js wird im Eventhander onBackendOrderPostDispatch nicht korrekt angesprochen. Richtig ist backend/order/detail/ordermod/overview.js. Ich wollte außerdem ein Feld vom Typ Datetime, statt zwei Textspalten, hinzufügen. Funktioniert auch alles wunderbar. Das Feld wird in der DB nach einer Bestellung befüllt. Im Backend seh ich in der Liste eine entsprechende Spalte und auf der Overview-Seite das entsprechende Feld, aber es ist in beiden Fällen immer leer. Ich vermute, daß ich noch den korrekten Datentyp in attribute.js angeben muss, damit es funktioniert. Wie muss der lauten? Hab’s schon mit „date“ und „datetime“ ausprobiert. Hat allerdings nicht geklappt. Viele Grüße Fabian

1 „Gefällt mir“

Moin moin, gibt’s ne Antwort auf meine Frage, welcher Datentyp in attribute.js anzugeben ist? Oder funktioniert nur String?

Push… irgendjemand muss doch wissen, wie man die attribute.js einstellt

Ein frohes Neues. Ich muss mich hier mal ranhängen. Das Beispiel-Plugin ist genau das was ich gesucht habe. Ich habe im Template ein neues Select-Feld mit 4 Auswahlmöglichkeiten eingebaut. Wie muss ich $orderAttributeModel-\>setOrdermodRandom1(rand(1,49)); ändern, damit die Auswahl des Kunden (Value) gespeichert wird? Das Select-Feld: [code][/code]

Ich komme hier leider keinen Schritt weiter. Beim Checkout soll die Auswahl des Nutzers in das neue Feld geschrieben werden. Ich habe nur keine Ahnung, wie ich den Value der ausgewählten Option in die Datenbank bekomme.

Moni Eibe, in der Methode onSaveOrder hast Du die beiden Zeilen $orderAttributeModel-\>setOrdermodRandom1(rand(1,49)); $orderAttributeModel-\>setOrdermodRandom2(rand(1,49)); (In Bootstrap.php Zeile 62 und 63) Diese schreiben zwei Zufällige Werte in zwei Spalten. Da Du nur eine Spalte befüllen willst, kannst Du deswegen eine Zeile löschen. Der Aufruf von $orderAttributeModel->set…() ist abhängig davon, wie Du Dein Feld in der Datenbank genannt hast, und wie Dein Modul heisst. Bei der Installation des Plugins definiert man, wie dieser Aufruf zu lauten hat. Diese Definition wird in der Methode installOrderAttributes durchgeführt. Im Original-Plugin hast Du zwei mal den Aufruf von Shopware()-\>Models()-\>addAttribute( 's\_order\_attributes', 'ordermod', 'Random1', 'DECIMAL(12,4)', false, 0.0000); Shopware()-\>Models()-\>addAttribute( 's\_order\_attributes', 'ordermod', 'Random2', 'DECIMAL(12,4)', false, 0.0000); Für die Felder Random1 und 2. Den einen Aufruf kannst löschen. Den anderen passt Du für Dich an. Wobei der 2. Parameter ‚ordermod‘ entsprechend Deinem Modul genannt werden sollte und der 3. Parameter muss wie Dein Feld in der Datenbank heissen. Der 4. Parameter gibt den Datentyp der Spalte an. Aus diesen beiden Parametern ergibt sich nun der genau Methoden-Name für $orderAttributeModel->set…() Nämlich $orderAttributeModel->setModulnameFeldname() Wichtig ist, daß Du nur Buchstaben in beiden Parametern verwendest. Mit einem _ im Namen hatte ich z.B. Probleme. Beispiel: Angenommen wir wollen eine Erweiterung haben, welches am Ende der Bestellung eine kleine Umfrage beim Kunden startet. Nur eine Selectbox und eine Auswahl von 1-5 Sternen soll angezeigt werden. Nennen wir das Modul deswegen Bewertung und Dein Attribut Sterne. Dann müssten wir zum einen in installOrderAttributes() folgendes stehen haben: Shopware()-\>Models()-\>addAttribute( 's\_order\_attributes', 'bewertung', 'Sterne', 'INT(11)', false, 0.0000); und zum anderen in onSaveOrder() in Zeile 62: $orderAttributeModel-\>setBewertungSterne($sterne) Capital-Letters werden automatisch gesetzt, denk ich. Außerdem musst Du den Wert für sterne selbst ermitteln. Ich denke daß es per _POST[‚sterne‘] gehen sollte. Weiß jedoch nicht, ob’s auch best Practice ist. Viele Grüße Fabian

1 „Gefällt mir“

Hallo Fabian, erstmal vielen Dank für Deine Antwort. Soweit funktioniert auch alles, also das Feld in s_order_attributes wird angelegt und es erscheint im Backend. [quote=“Fabi_”] und zum anderen in onSaveOrder() in Zeile 62: $orderAttributeModel-\>setBewertungSterne($sterne) Capital-Letters werden automatisch gesetzt, denk ich. Außerdem musst Du den Wert für sterne selbst ermitteln. Ich denke daß es per _POST[‘sterne’] gehen sollte. Weiß jedoch nicht, ob’s auch best Practice ist. [/quote] Genau hier bleibe ich aber hängen. Wenn ich das standardmäßige Kommentarfeld (sComment) mit $orderAttributeModel-\>setOrdermodRandom1($\_POST['sComment']); hole, schreibt er es mir in das Feld Random1. Das funktioniert also. Ich schaffe es nur nicht, ein von mir angelegtes Kommentarfeld/Select zu holen, bspw: $orderAttributeModel-\>setOrdermodRandom1($\_POST['meinKommentarFeld']); Stehe da gerade total auf dem Schlauch.

Moin Eibe, also wenn’s mit sComment funktioniert und mit meinKommentarFeld nicht, kann es sein, daß meinKommentarFeld nicht an den Server gesendet wird, oder ein Filter dieses vorher entfernt. Welchen Browser nutzt Du? Im Firefox mit dem Addon Firebug kannst Du unter dem Reiter Netzwerk sehen, welche POST-Daten verschickt werden. Gleiches ist auch in Chrome möglich. Hier gibt’s dieses Feature jedoch schon von Haus aus. Wenn das Feld meinKommentarFeld übertragen wird, dann sprich das für einen Filter innerhalb von Shopware. Wenn nicht, dann hast Dein Select-Tag im falschen Forumlar platziert. Viele Grüße Fabian

Hab es jetzt! meinKommentarFeld wurde tatsächlich nicht gesendet. In confirm.tpl gibt es eine Form, die den sComment als input type=„hidden“ mitschickt. Mal eine Zusammenfassung, evtl. hilft es ja jemanden. Aufgabenstellung für mich war: - Select-Feld (4 Optionen) auf der Confirm-Seite, - ausgewählte Option wird in der DB gespeichert, - ausgewählte Option erscheint in Bestellbestätigungs-Mail Ich habe das ganze nun folgendermaßen gelöst: Im confirm.tpl habe ich (zusätzlich zu meinem eigentlichen Select) der o.g. Form ein input type=„hidden“ angehängt. Wählt der Kunde etwas aus, wird der Value dieses inputs per Javascript geändert. Im Event ‚Enlight_Controller_Action_PreDispatch_Frontend_Checkout‘, Action ‚finish‘ habe ich mein Feld (sInstFound) an die Session angehängt: public function onFrontendPreDispatchCheckout(Enlight\_Event\_EventArgs $arguments) { $controller = $arguments-\>getSubject(); $view = $controller-\>View(); $request = $controller-\>Request(); if ($request-\>getActionName() !== 'finish' || $request-\>getModuleName() !== 'frontend' || !$view-\>hasTemplate()) { return; } Shopware()-\>Session()-\>sInstFound = $request-\>getParam('sInstFound'); Jetzt das ganze in der DB speichern und an die Bestätigungs-Mail aufnehmen. Event ‚Shopware_Modules_Order_SendMail_FilterVariables‘: Übergebenen Wert wiederholen: $monfund = Shopware()-\>Session()-\>sInstFound; In die DB schreiben: $orderAttributeModel-\>setOrdermodRandom1($monfund); In der Bestellbestätigung als {$attributes.attributeX} zur Verfügung stellen: $orderAttributes['attributes']['attributeX'] = (string)$monfund; Das geht vermutlich eleganter, aber es läuft…

Hallo, kann mir jemand sagen, wo ich das Plugin finde, über das hier besprochen wurde. Also das mit: backend/order/detail/ordermod/overview.jsund$orderAttributeModel-\>setOrdermodRandom1(rand(1,49)); Ich habe nur das hier gefunden: Shopware 4 - Add 2 new colums to Order-Model & fill them through order process Aber das ist das andere hier besprochene Beispiel nur mit Bootstrap, aber ohne Backend-JS.

1 „Gefällt mir“

Ich möchte den Thread noch einmal kurz aufleben lassen - das Ganze funktioniert aber nicht bei Bestellungen, die über andere Paymentanbieter laufen, korrekt? Weil, Ihr übertragt “nur” Daten von dir Confirm auf die Finish - wenn z.B. per PayPal gekauft wird, läuft die Confirm aber erst auf (wie gesagt) z.B. an PayPal, und von PayPal auf die Finish des Shops, dabei werden die POST Daten nicht übertragen.

Hat dafür einer eine Lösung?

Schöne Grüße,
Niklas

Fuer v5.2 muss man:

  1. in Boostrap.php create an event to extend sql query
    $this->subscribeEvent(
                    ‚Shopware\Models\Order\Repository::getBackendOrdersQueryBuilder::after‘,
                    ‚backendGetBackendOrdersQueryBuilder‘
                    );
  2. in Boostrap.php create new function to extend the query with join to attributes

public function backendGetBackendOrdersQueryBuilder(Enlight_Event_EventArgs $args)
    {
        $builder = $args->getReturn();

        $builder->leftJoin(‚orders.attribute‘, ‚attribute‘);
        $builder->addSelect(array(‚attribute‘));

        $args->setReturn($builder);
    }

in your plugin files create backend\xxx_order\model\order.js;
and extend fields block:
//{block name=„backend/order/model/order/fields“ append}
{
    name: ‚attribute.attribute1‘, type: ‚string‘ 
},
//{/block}

in view i.e. backend\xxx_order\view\list\list.js
read the attribute field with dataIndex:‚attribute.attribute1‘
i.e. on order list show new column
//{block name=„backend/order/view/list/list“ append}
Ext.define(‚Shopware.apps.XxxOrder.view.list.List‘, {
    override: ‚Shopware.apps.Order.view.list.List‘,

getColumns: function() {
        var me = this;

        var columns = me.callOverridden(arguments);

        var attrColumn = {
                header: ‚Attr1‘,
                dataIndex:‚attribute.attribute1‘,
                flex: 1,
                sortable: false
        };                
        return Ext.Array.insert(columns, 2, [attrColumn]);
    },

});
//{/block}