Hallo liebe shopware - Gemeinde, ich würde gerne die Attributfelder von s_order_attributes zum Speichern zusätzlicher Werte nutzen. Ich habe auch schon alles notwendige im Plugin umgesetzt, um ein neues Eingabefeld auf der Confirmseite im entsprechenden Formular zu erhalten: private function subscribeEvents(){ $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PreDispatch\_Frontend', 'onPreDispatch' ); $this-\>subscribeEvent( 'Shopware\_Controllers\_Frontend\_Checkout::saveOrder::before', 'onSaveOrder' ); } public function onPreDispatch(Enlight\_Event\_EventArgs $arguments){ /\* Hier füge ich dem confirm-Form ein weiteres Inputfeld zu\*/ /\* Endresultat im Formular: <input type="text" id="o_attr_1" name="o_attr_1" value="" class=""> \*/ } public function onSaveOrder(Enlight\_Hook\_HookArgs $args) { $order = $args-\>getSubject(); }
Nur bei der onSaveOrder komme ich nicht weiter, da am Ende das Feld attribute1 von s_order_attributes immer leer bleibt - gleiches bei der E-Mail. sSaveOrder in sOrder.php nimmt ja die Attributfelder entgegen ($this->o_attr_1) und speichert diese ab. Nur wie übergebe ich der Funktion durch meine onSaveOrder den Wert, damit diese ihn verarbeiten kann? Ich habe auch die anderen Forumthemen durchgearbeitet (bspw.: programmierung-f56/freitextfelder-in-bestellung-t8839.html), bin aber leider zu keinem Ergebnis gekommen. Könnte mir jemand auf die Sprünge helfen? Beste Grüße Sebastian
Vielleicht hilft dir das etwas?!
[quote=„Creatixx“]Vielleicht hilft dir das etwas?![/quote] Hallo, das hatte ich auch schon gefunden, nur erstelle ich da ja neue Spalten statt die bestehenden (o_attr_1 - 6) zu nutzen (es gibt ja auch ein erweitertes, zweites Beispiel zu deinem: https://gist.github.com/sthamann/5343247). Ich konnte dort auch nicht wirklich rauslesen, wie ich da meine Daten, die ich neu im Confirm-Formular eingebe, dann in die Datenbank übertrage (dort wird ja ein fester Wert „Test“ übergeben und keine Formulardaten). Und ist die Variable bei dem Beispiel dann auch in der sOrder-Mail und in der Datenbank? Beste Grüße Sebastian
Hallo, diese Felder werden doch sicherlich von einigen Plugins genutzt - hat da keiner einen Tipp für mich, wie ich den Wert an die eigentliche sSaveOrder in sOrder.php weitergebe? Wenn ich den Ansatz von Stefan Hamann (shopware AG Team) verfolgen würde: class Shopware\_Plugins\_Frontend\_SwagTestCases\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { /\*\* \* Install plugin method \* \* @return bool \*/ public function install(){ // Add 2 new columns to s\_order\_attributes Shopware()-\>Models()-\>addAttribute('s\_order\_attributes','myPrx','Test1','varchar(255)', false, 0); Shopware()-\>Models()-\>addAttribute('s\_order\_attributes','myPrx','Test2','varchar(255)', false, 0); $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); Shopware()-\>Models()-\>generateAttributeModels( array('s\_order\_attributes') ); $this-\>subscribeEvent('Shopware\_Modules\_Order\_SendMail\_FilterVariables','OnBeforeSendOrderConfirmation'); return array('success' =\> true, 'invalidateCache' =\> array('backend', 'proxy')); } public function OnBeforeSendOrderConfirmation (Enlight\_Event\_EventArgs $args){ $orderVariables = $args-\>getReturn(); $ordernumber = $orderVariables["ordernumber"]; // Find order id by order number $order = Shopware()-\>Models()-\>getRepository('Shopware\Models\Order\Order')-\>findOneBy(array('number'=\>$ordernumber)); $orderAttributeModel = Shopware()-\>Models()-\>getRepository('Shopware\Models\Attribute\Order')-\>findOneBy( array("orderId"=\>$order-\>getId())); if ($orderAttributeModel instanceof \Shopware\Models\Attribute\Order){ $orderAttributeModel-\>setMyPrxTest1("Test"); $orderAttributeModel-\>setMyPrxTest2("Test2"); Shopware()-\>Models()-\>persist($orderAttributeModel); Shopware()-\>Models()-\>flush(); } $args-\>setReturn($orderVariables); } }
könnte ich dann ja das Inputfeld wie bei mir in das entsprechende Formular einfügen. Leider ist bei mir bei jeder Bestellung auch bei $orderAttributeModel->setMyPrxTest1(„Test“); das Feld myPrx_Test1 leer. Woran könnte das liegen? Ich habe das Beispiel so übernommen. Statt der festen Werte Test und Test2 müsste dann ja aber meine Formulareingabe verwendet werden. Würde ich dann über: $postData = $args-\>getSubject()-\>Request()-\>getPost(); $myprx\_test1 = $postData["myPrx\_Test1"];
an den Eingabewert rankommen und könnte diesen dann über: $orderAttributeModel-\>setMyPrxTest1($myprx\_test1);
an die Datenbank und in die E-Mail-Vorlage übertragen? Beste Grüße Sebastian
Hallo, um den Ansatz von Stefan Hamann (shopware AG Team) weiter zu verfolgen: class Shopware\_Plugins\_Frontend\_SwagTestCases\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { /\*\* \* Install plugin method \* \* @return bool \*/ public function install(){ // Add 2 new columns to s\_order\_attributes Shopware()-\>Models()-\>addAttribute('s\_order\_attributes','myPrx','Test1','varchar(255)', false, 0); Shopware()-\>Models()-\>addAttribute('s\_order\_attributes','myPrx','Test2','varchar(255)', false, 0); $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); Shopware()-\>Models()-\>generateAttributeModels( array('s\_order\_attributes') ); $this-\>subscribeEvent('Shopware\_Modules\_Order\_SendMail\_FilterVariables','OnBeforeSendOrderConfirmation'); return array('success' =\> true, 'invalidateCache' =\> array('backend', 'proxy')); } public function OnBeforeSendOrderConfirmation (Enlight\_Event\_EventArgs $args){ $orderVariables = $args-\>getReturn(); $ordernumber = $orderVariables["ordernumber"]; // Find order id by order number $order = Shopware()-\>Models()-\>getRepository('Shopware\Models\Order\Order')-\>findOneBy(array('number'=\>$ordernumber)); $orderAttributeModel = Shopware()-\>Models()-\>getRepository('Shopware\Models\Attribute\Order')-\>findOneBy( array("orderId"=\>$order-\>getId())); if ($orderAttributeModel instanceof \Shopware\Models\Attribute\Order){ $orderAttributeModel-\>setMyPrxTest1("Test"); $orderAttributeModel-\>setMyPrxTest2("Test2"); Shopware()-\>Models()-\>persist($orderAttributeModel); Shopware()-\>Models()-\>flush(); } $args-\>setReturn($orderVariables); } }
Die beiden Felder myPrx_Test1 und myPrx_Test2 werden bei der Tabelle s_order_attributes erstellt, in der Bestellbestätigungsemail sind Sie auch vorhanden ({$attributes.myPrx_Test1} und {$attributes.myPrx_Test2}). Trotzdem bleiben Sie sowohl in der Datenbank als auch in der E-Mail leer, obwohl durch: $orderAttributeModel-\>setMyPrxTest1("Test"); $orderAttributeModel-\>setMyPrxTest2("Test2");
aus meiner Sicht ja Werte gesetzt wurden. Ich habe das Beispiel ja erst einmal 1 zu 1 übernommen, verschrieben oder ähnliches kann ich mich ja nicht haben. Hat jemand eine Idee, warum die Felder leer sind? Beste Grüße Sebastian
Hallo, das Speichern der Werte aus den Code-Beispielen funktioniert nun - ein anderes Plugin hat das Speichern der Werte abgefangen. Nur löst das natürlich nicht die Anfangsfrage,wie man die Attribute o_attr_1 - 6 nutzen kann. Beste Grüße Sebastian