ich versuche mich an einem kleinen Konfigurator und möchte hierzu dem Kunden die Möglichkeit bieten ein Bild hochzuladen.
Die entsprechenden Templateanpassugen (js/less/artikeltemplate) habe ich realisiert,… Allerdings steige ich nicht durch, den Bestellprozess, bzw dass entsprechende Model für die Order dahingehend zu erweitern, dass ich den Bildpfad speichern kann.
Bin dankbar für jeden Tipp/Anregung und teile das entstehende Ergebnis gerne.
Ich hab nun Checkout::ajaxAddArticleCartAction gehookt.
Im Template habe ich dem buy-form einfach mal testweise ein text-input feld hinzugefügt, dass ich dem zu speichernden Artikel mitgeben möchte.
Leider wird dieses nicht übergeben. Muss ich zusätzliche Felder iwie registrieren?
Soweit ich sehe, verarbeitet ajaxAddArticleCart nur den Index des Artikels und die Bestellmenge.
Um zusätzliche Daten zu speichern, muss ich die Funktion und alle anhängen ebenfalls erweiteren, richtig?
eine einfachere möglichkeit wäre es wenn du das Bild schon speicherst bevor der Artikel in den Warenkorb gelegt wird. Wenn du darauf achtest wird der AJAX-Request für den Warenkorb als jsonp Request gesendet wo dann ein Bildupload nicht mehr funktionieren würde.
Nachdem der Artikel abgelegt wurde kannst du dich wie du schon beschrieben hast anhängen und den Upload korrekt zuweisen.
Noch ein Hinweis: die ajaxAddArticleCartAction wird nur beim Off-Canvas Warenkorb gefeuert, der normale Warenkorb spricht die Action „afterAddArticleAction“ an. Du müsstest beide hooken.
Schau dir dazu mal die Datei themes/Frontend/Responsive/frontend/_public/src/js/ jquery.add-article.js an, da wird die Form gesendet.
Sonst noch an sAddArticle in der sBasket anhängen da bekommst du die basketID womit du in s_order_basket_attributes ein weiteres Feld mit deinen eigenen Daten befüllen könntest.
Wid komm ich an die basketId ran? Habe die sBasket::sAddArticle gehooked, komme aber nur an die artikelId ($arguments->getId()) und quantitiy, also die Übergabeparameter,ran…
insertId müsste ja die ID des Basket sein oder? Hierbei wird nichts zurück gegeben:
public function sAddArticleAfter(Enlight_Hook_HookArgs $arguments){
Shopware()->Debuglogger()->info('sBasket::sAddArticle::after insertId --- '.$arguments->get('insertId'));
}
Eine Prinzipielle Frage, dieser Hook wird nicht ausgeführt… warum?
public function install() {
$this->subscribeEvent('Checkout::ajaxAddArticleCartAction::after', 'AjaxAddArticleCartActionAfter');
return true;
}
public function AjaxAddArticleCartActionAfter(){
Shopware()->Debuglogger()->info('ajaxAddArticleCartAction::after');
}
ich habe die AjaxAddArticleCartActionAfter gehooked. Allerdings scheint es so,… das ich nicht auf protected properties wie basket zugreifen kann.
Im eine anderen Thead wird das Problem geschildert, als Lösung sagt der Verfasser, hätte er basket einfach neu angelegt. Ich habe diverse Instanzierungen versucht, leider ohne Erfolg. Wie geht das?
exception ‚Enlight_Exception‘ with message ‚Property „basket“ not found failure‘
public function AjaxAddArticleCartActionAfter(Enlight_Hook_HookArgs $arguments){
$article= $arguments->getSubject();
Shopware()->Debuglogger()->info('ajaxAddArticleCartAction replace sc='.$article->getBasket()['sAmount']);
$orderNumber = $article->Request()->getParam('sAdd');
$quantity = $article->Request()->getParam('sQuantity');
$article->View()->assign(
'basketInfoMessage',
$article->getInstockInfo($orderNumber, $quantity)
);
if ($article->Request()->get('sAddAccessories')) {
$article->addAccessories(
$article->Request()->getParam('sAddAccessories'),
$article->Request()->getParam('sAddAccessoriesQuantity')
);
}
//-------------Inder folgenden ZEILE wird der Fehler geschmissen --------------
$article->basket->sAddArticle($orderNumber, $quantity);
$article->forward('ajaxCart');
}
meckern, denn die Methode ist auch private. Du könntest die aber einfach in deine Bootstrap übernehmen und noch einen dritten $basket Parameter dranhängen und mit übergeben (und in der eigenen addAccessories dann $this->basket mit dem $basket Parameter austauschen).
konntest du eigentlich schon dein Problem lösen? Ich müsste ebenso ein Eingabewert auf der Artikel-Detailseite etc in einem eigenen Feld in der s_order_basket_attributes übertragen, nur hänge ich derzeit auch bei der Übertragung in das eigene Feld.
Also hier mal meine Bootstrap zum abspeichern eines zusätzlichen Artikel-Feldes für den Ajax-Warekorb.
Optimalerweise erstellt man im Plugin auch gleich die entsprechenden Templateanpassungen und überschreibt
damit das verwendete Tempalte (i.d.R. Responisve). Die Anpasungen werden unter frontend/detail in der entsprechende Tempaltedatei vorgenommen.
Achtet darauf, dass das Feld auch wirklich im Formular steht und ein entsprechendes name-Attribut hat. Zum testen empfiehlt sich
FirePHP und unter Verwendung de sDebuglogger; der Aufruf: Shopware()->Debuglogger()->info(‘update basketID=’.$basketId); wird dann in FireBug/Netzwerk getraced…
subscribeEvent('Shopware_Controllers_Frontend_Checkout::ajaxAddArticleCartAction::replace', 'AjaxAddArticleCartActionReplace');
return true;
}
public function AjaxAddArticleCartActionReplace(Enlight_Hook_HookArgs $arguments){
/* Referenz auf die Originalmethode, bzw deren Objekte */
$article= $arguments->getSubject();
$orderNumber = $article->Request()->getParam('sAdd');
$quantity = $article->Request()->getParam('sQuantity');
/* Zusaetzliche Felder einlesen */
$sAttr1= $article->Request()->getParam('sAttr1');
$article->View()->assign(
'basketInfoMessage',
$article->getInstockInfo($orderNumber, $quantity)
);
if ($article->Request()->get('sAddAccessories')) {
Shopware()->Debuglogger()->info('sAddAccessories replace sc='.$article->getBasket()['sAmount']);
$article->addAccessories(
$article->Request()->getParam('sAddAccessories'),
$article->Request()->getParam('sAddAccessoriesQuantity')
);
}
/* Aktuellen Warenkorb holen */
$basket = Shopware()->Modules()->Basket();
$basketId=$basket->sAddArticle($orderNumber, $quantity);
/*
Attri1 wird in die basket Tabelle geschrieben
Wenn der Warekorb in eine Bestellung gewandelt wird,
werden die Attribute aus s_order_basket_attributes nach s_order_attributes automatisch uebertragen.
Einziger Wermutstropfen ist, das die Felder der Tabelle VarChar(255) sind, es ist also nicht sonderlich
viel Platz. Man kann den Feldtyp haendisch aendern, oder eine eigene Tabelle anlegen, wenn andere Datentypen
benoetigt werden. Um konsistent zu beleiben sollte diese neue Tabelle auch eine basket-Version haben...
Die entsprechenden Methoden muessen dementsprechend ebenfalls erweitert werden
*/
$sql = "
UPDATE s_order_basket_attributes
SET attribute2 = ?
WHERE basketID = ?
";
$update = Shopware()->Db()->query(
$sql,
array(
$sAttr1,
$basketId
)
);
$article->forward('ajaxCart');
}
}
du hast ja in deinem Beispiel das Attributfeld attribute2 genutzt, das ja automatisch bei sOrder in die s_order_details_attributes übertragen wird. Wenn ich jetzt aber ein eigenes Attributfeld verwende(t habe), übertragt er dieses ja nicht automatisch in die s_order_details_attributes, weil das ja nur für die attribute 1 - 6 geschieht.
Hast du da das Event Shopware_Modules_Order_SaveOrderAttributes_FilterDetailsSQL um das zusätzliche Attributfeld erweitert, damit dieses auch automatisch in die s_order_details_attributes übernommen wird? Oder hast du die komplette sOrder-Funktion überschrieben (replace)? Oder hat @steinsoftware dazu eine Idee oder jemand anderer?
Hast du schon eine Änderung des Wertes berücksichtigt, beispielsweise im Warenkorb? Da müsste man ja wahrscheinlich über ein after-Hook auf die changeQuantityAction ansetzen.
gute Gedanken, bzw praxisnahe Ne ich hab noch nicht weitergedacht. Werde in meinem speziellen Fall auch wahrscheinlich darüber hinwegsehen können. Sowohl über mehr Attribute, also auch über die Bearbeitbarkeit im Korb. Trotzallem wäre es cool, wenn es hier weiterginge.
Mit dem Event Shopware_Modules_Order_SaveOrderAttributes_FilterDetailsSQL hab ich mich noch nich auseinander gesetzt.
changeQuantityAction, hört sich so an als würde die evtl. nur getriggert werden, wenn die Anzahl auch tatsächlich verändert wird.
Ich werde in der nächsten Woche an mein Plugin gehen und dann hier sicherlich auch wieder aktiv teilnehmen, für diese Woche ist Templateintegration