Hallo, ich habe eine Frage. Ich habe mit meinem Plugin bei der Installation 2 neue Felder in die Tabelle s_order angelegt. Nun müssen die beim Bestellvorgang auch befüllt werden. Ich fand nun die Klasse sOrder mit der Methode sSaveOrder() und da drin ist das SQL für das speichern des Orders als harter SQL String geschrieben. Wie kann ich es erreichen das nun meine beiden Felder in der Tabelle mit meinen Werten befüllt werden beim Bestallabschluss. Die Methode überschreiben halte ich für weniger gut, wüsste in dem Fall auch nicht wie, denn da müsste ich an andere Stelle ja wieder meine sOrder einbinden. Mit einem Hook weiß ich auch grad nicht wie, denn wie soll ich mit dem Hook so eingreifen das der SQL String manipulirt werden kann. Kann mir dazu bitte jemand Hilfestellung geben, wie ich den Bestellvorgang so erweitern kann das meine beiden Zusatzfelder in der Tabelle mit gefüllt werden? Vielen Dank für eure Hilfe Gruß Daniel
Also ich konnte eine Lösung finden, allerdings bin ich mir nicht wirklich sicher ob diese so gut und richtig ist. Event registieren. $event = $this-\>createEvent( 'Shopware\_Modules\_Order\_SaveOrder\_FilterSQL', 'onSaveOrder');
Code für die Event Methode in der Bootstrap. public function onSaveOrder(Enlight\_Event\_EventArgs $args) { $amount = Shopware()-\>Modules()-\>Basket()-\>sGetBasket(); $sql = $args-\>getReturn(); $sql = substr($sql, 0, strpos($sql, 'ordernumber, ')) . 'amount\_org, mycompany\_coupon\_value, ' . substr($sql, strpos($sql, 'ordernumber, ')); $sql = substr($sql, 0, strpos($sql, 'VALUES (') + 8) . str\_replace(',', '.', $amount['Amount']) . ', ' . $this-\>\_mycompanyCoupon-\>data . ', ' . substr($sql, strpos($sql, 'VALUES (') + 8); return $sql; }
Ich habe da bedenken wenn ein anderes Modul den String genauso oder anders manipuliert das es da Kollisionen geben kann. Also wenn jemand einen besseren Vorschlag hat wie ich meine Daten in die Tabelle bekomme und das Statement so manipulieren kann das es keine Kollisionen mit anderen Modulen geben kann wäre ich dankbar. Und noch eine Frage habe ich gleich mit. Wie kann ich im Backend unter den Bestelldetais im Reiter Übersicht Freitextfelder so belegen das meine beiden in der Tabelle gespeicherten Werte da drin stehen? Ich brauche da einmal den Original Preis und den Gutscheinwert. Beides wird ja in der s_order gespeichert.
Hallo, schau dir mal das nachfolgende Beispiel-Plugin an - damit werden 2 neue Spalten in der Tabelle s_order_attributes hinzugefügt, die während der Bestellung mit den Sample-Werten „Test1“ & „Test2“ befüllt werden - das kannst du also als Vorlage verwenden. [code]<?php /**
- Shopware 4.0
- Copyright © 2012 shopware AG
- According to our dual licensing model, this program can be used either
- under the terms of the GNU Affero General Public License, version 3,
- or under a proprietary license.
- The texts of the GNU Affero General Public License with an additional
- permission and of our proprietary license can be found at and
- in the LICENSE file you have received along with this program.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
- „Shopware“ is a registered trademark of shopware AG.
- The licensing of the program under the AGPLv3 does not imply a
- trademark license. Therefore any rights, title and interest in
- our trademarks remain entirely with us.
- @category Shopware
- @package Shopware_Plugins
- @subpackage AdvancedMenu
- @copyright Copyright © 2012, shopware AG (http://www.shopware.de)
- @version Id
- @author Heiner Lohaus
-
@author Author
/
/* - Shopware AdvancedMenu Plugin
- todo@all: Documentation
/
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); } } [/code]
-
Aber die Werte die angezeigt werden sollen die neu in der s_order Tabelle gespeichert werden müssen ja angezeigt werden. Sorry mir fehlt grad der Bezug zu s_order_attributes und Werten die in der s_order Tabelle stehen.
Die Tabellen sind ja verknüpft s_order.id => s_order_attributes.orderId - darüber kannst du dir deine Zusatzfelder an beliebiger Stelle wiederholen, wenn du die ausgeben möchtest etc. Über diesen Weg ist sichergestellt, dass dein Plugin sich nicht mit anderen Erweiterungen in die Quere kommt.
Auf welche Frage sind deine Antworten jetzt? Auf die erste oder die zweite Frage? Heist ich soll die neuen Werte nicht in die s_order schreiben sondern gleich in die s_order_attributes? Und somit fahre ich nicht das Risiko beim SQL String manipulieren das es da mit anderen Plugins zur Kollision kommt? Ist deine Antwort darauf bezogen?
Ja, genau! Damit bist du Update & Kollisionssicher. Die Daten kannst du dir dann lesend ja per Plain-SQL z.B. zurück holen - SELECT myPrx_Test1, myPrx_Test2 FROM s_order_attributes WHERE orderID = ID_DER_BESTELLUNG Oder z.B. SELECT myPrx_Test1, myPrx_Test2 FROM s_order_attributes INNER JOIN s_order ON s_order.id = s_order_attributes.orderID ORDER BY s_order.id DESC LIMIT 30 Die beiden angegeben Spalte für die letzten 30 Bestellungen abholen.
Ok danke, dann werde ich das morgen mal so umbauen und in die s_order_attributes Tabelle speichern meine beiden Werte. Wie kann ich die dann im Backend aber unter die Bestellübersicht anzeigen lassen? Mein Plugin spielt sich ja hauptsächlich im Frontend ab. Muss ich dafür extra ein Backend Plugin schrieben oder wie kann ich das machen?
Guten Morgen, also die Attributes werden erfolgreich installiert. Aber die eigentliche Event Methode funktioniert leider nicht. public function onSaveOrder(Enlight\_Event\_EventArgs $args) { $orderAttributes = $args-\>getReturn(); $orderNumber = $orderAttributes['ordernumber']; $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) { $amount = Shopware()-\>Modules()-\>Basket()-\>sGetBasket(); $orderAttributeModel-\>setAmountOrgPriceOriginal(str\_replace(',', '.', $amount['Amount'])); $orderAttributeModel-\>setamalingoCouponValueCouponPrice($this-\>\_mycompanyCoupon-\>data); Shopware()-\>Models()-\>persist($orderAttributeModel); Shopware()-\>Models()-\>flush(); } $args-\>setReturn($orderAttributes); }
Das Problem ist schon das $args->getReturn() einfach leer ist bzw. nicht initialisiert, laut meines XDebug. Da dies an der Stelle leer ist kann natürlich alles andere nicht funktionieren. Der Event wird beim installieren so angelegt in der DB. $event = $this-\>createEvent( 'Shopware\_Modules\_Order\_SendMail\_BeforeSend', 'onSaveOrder'); $this-\>subscribeEvent($event);
Was läuft da falsch, wo muss ich ansetzen?
Du arbeitest aber mit Shopware 4, right? Der Event sollte gefeuert werden, sobald du eine Bestellung abschickst - wenn ich dich richtig verstehe, wird die Methode onSaveOrder zwar aufgerufen, $orderAttributes ist aber komplett leer? Wenn dem so ist, dann schau dir mal die Methode sendMail in /engine/core/class/sOrder.php an - dort wird der Event in Zeile 822 gefeuert - dort dann bitte mal einen Breakpoint auf $variables setzen und prüfen, ob die korrekt an die Methode übergeben werden.
Ich hatte den falschen Event benutzt. Es klappt jetzt die Attribute werden eingetragen. Kann ich irgendwo nachlesen wie ich die nun der Bestellübersicht gleich im Reiter Übersicht mit anzeigen kann?
Hey, ja, in diesem Tutorial werden neue Felder in der Kundenliste hinzugefügt: http://wiki.shopware.de/Einsteiger-Schu … 2_444.html Nach dem gleichen Schema kannst du das auch in der Bestellübersicht machen!
Da lese ich das ein reines Backend Modul ist, meins jedoch spielt sich aber fast nur im Frontend ab, kann ich das so in einem Frontend Modul auch unterbringen? Oder wie implementiert man ein Modul was Frontend wie Backend Funktionalitäten benötigt?
Welche Javascripte sind denn dafür verantwortlich das die neuen Attribute und die Werte dazu im Backend sichtbar werden? Ich habe nur die attributes.js gefunden, wenn ich die aber erweiter dann sehe ich trotzdem nichts im Backend. Mein Event. $event = $this-\>createEvent( 'Shopware\Models\Order\Repository::getOrdersQueryBuilder::after', 'afterGetOrderDataQuery'); $this-\>subscribeEvent($event);
Die Methode dazu public function afterGetOrderDataQuery(Enlight\_Hook\_HookArgs $args) { $builder = $args-\>getReturn(); $builder-\>addSelect(array( 'attributes.amountOrgPriceOriginal', 'attributes.mycompanyCouponValueCouponPrice' )); $builder-\>leftJoin('orders.attribute', 'attribute'); $args-\>setReturn($builder); }
Dann die PostDispatch Methode plus das Event. //event $event = $this-\>createEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Backend\_Order', 'onBackendOrderPostDispatch'); //methode public function onBackendOrderPostDispatch(Enlight\_Event\_EventArgs $args) { $view = $args-\>getSubject()-\>View(); $this-\>Application()-\>Snippets()-\>addConfigDir($this-\>Path() . 'Snippets/'); $view-\>addTemplateDir($this-\>Path() . 'Views/'); if ($args-\>getRequest()-\>getActionName() == 'loadStores') { $view-\>extendsTemplate('backend/order/model/attribute.js'); } }
Und die JS Datei so angepasst. { name: 'amountOrg\_PriceOriginal', type: 'string', useNull: true }, { name: 'mycompanyCouponValue\_CouponPrice', type: 'string', useNull: true }
Was mache ich da wo genau falsch?
Hallo, also momentan komme ich ehrlich kein einziges Stück weiter. Wenn ich jetzt im Backend meine Bestellliste aufrufe wird die zwar angezeigt, aber alle Werte mit 0.00 ausgegeben. Wenn ich auf den Stift zum bearbeiten drücke dann bekomme ich im Firebug ne out of Range Fehlermeldung. Welche Javascript Dateien muss ich genau in mein Plugin Ordner ziehen und anpassen, damit ich meine 2 Werte in der Bestellübersicht im Detailreiter Übersicht angezeigt bekomme? Danke für eine Antwort Gruß Daniel
Hallo, kannst du nochmal den aktuellen Stand von deinem Plugin komplett als Zip hier einstellen? Dann schaue ich mir das an.
Kann ich das ZIP als PN hier im Forum an dich schicken? Zumal ich momentan gar nichts finde wie ich hier überhaupt ein ZIP oder etwas anhängen kann. Wie kann ich hier im Forum ein ZIP mit senden?
Hey, dann schicke das einfach an forum@shopware.de mit Verweis auf mich. Kann ich das sobald lauffähig als Code-Sample hier http://wiki.shopware.de/shopware.php?sViewport=gist mit einbinden? Dann würde das zukünftig auch anderen weiterhelfen.
Ja, aber nicht mit dem Namen der Firma die dahinter steckt. Und wenn es geht nur den Teil der mit dem Backend und der Erweiterung der Orderübersicht. Ist das ok?
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.