Wie kann ich dem Artikel Frei-Felder hinzufügen, die in die Bestellung gespeichert werden

Hallo,

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.

Gruß Fabian

Schau mal unter „Hooks“

das sollte Dir weiterhelfen.

 

 

Viele Grüße
Alex
www.upware.de

Magento & Shopware-Hosting vom Spezialisten

Hej,… ok

hab’s.

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?
 

Hi tiefseh,

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.

Mit freundlichen Grüßen,
Simon Bäumer

Felder die mitgegeben werden sollen,… brauchen ein name-Attribut :wink:

Hey,
sorry hab wohl etwas zu schnell gelesen^^

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.

Grüße,
Simon :wink:

 

1 „Gefällt mir“

Hej Simon,

super, vielen Dank damit mach ich erstmal weiter.

Fabian

Hi, zwei Fragen:

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? :wink:

 

	public function install() {
		$this->subscribeEvent('Checkout::ajaxAddArticleCartAction::after', 'AjaxAddArticleCartActionAfter');
	  return true;
	}
	public function AjaxAddArticleCartActionAfter(){
		 Shopware()->Debuglogger()->info('ajaxAddArticleCartAction::after');
	}

 

1,5 Antworten:

$arguments->getReturn() gibt den return-Wert der gehookten Funktion zurück

Wie s ausschaut können nur Core-Klassen gehooked werden. Checkout kann somit nicht gehooked werden, richtig?

Hey tiefseh,

der Checkout Controller kann ebenfalls gehookt werden, z.B.
 

'Shopware_Controllers_Frontend_Checkout::changeQuantityAction::after'

Damit hätte sich die Frage warum das Event nicht korrekt registriert wird auch erübrigt :smiley:

Hier findest du einen Event Guide:
Shopware events

Und hier einen Blogpost zum Hook-System:
Understanding the Shopware hook system

Grüße,
Simon :wink:

Hallo nochmal.

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');
    
}

 

Eigentlich müsste er schon vorher bei

$article->addAccessories(

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).

Den Basket kannst du dir mit

 $basket = Shopware()-\>Modules()-\>Basket();

holen.

Hallo tiefseh,

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.

Beste Grüße

Sebastian

hej Sebastian, ja läuft mittlerweile.

Ich schreib dir ein Beispiel zusammen. Hatte ich sowieso vor :wink:

Wird aber morgen werden.

@tiefseh schrieb:

hej Sebastian, ja läuft mittlerweile.

Ich schreib dir ein Beispiel zusammen. Hatte ich sowieso vor ;)

Wird aber morgen werden.

Hallo,

klingt super, danke =).

Beste Grüße

Sebastian 

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');   
	}
}

Viel Spass :wink:

4 „Gefällt mir“

Hallo tiefseh,

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.

Beste Grüße

Sebastian

Hej Sebastian,

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

angesagt :confused:

Gruß
Fabian