Türchen 05: Ein Produkt mit individuellem Preis im Warenkorb

Nein, leider wieder keine Schokolade, sondern auch heute nur Quellcode. Diesmal schauen wir einmal wie man ein Produkt in den Warenkorb legen kann und dazu noch selbst den Preis bestimmt. Der aktuelle Warenkorb ist im Magento im Quote gespeichert. Genauer gesagt als Quote-Item. Das eigentliche Quote enthält nämlich zum Beispiel Informationen zum Empfänger oder Absender.

// Zuerst holen wir uns das aktuelle Quote,
// alternativ kann dies z.B. auch per Event sales_quote_save_before geschehen
$quote = Mage::getSingleton('checkout/session')->getQuote();

// Wir erstellen ein quoteItem (noch nicht im Warenkorb)
$quoteItem = Mage::getModel('sales/quote_item')->setProduct($product);
$quoteItem->setQuote($quote);

// Wie oft soll das Produkt im Warenkorb sein?
$quoteItem->setQty( 1 );

// Wir müssen den Preis doppelt setzen da Magento 1.4.1.1
// hier zwei unterschiedliche Werte abfragt
$quoteItem->setCustomPrice(0);
$quoteItem->setOriginalCustomPrice(0);

// Zum Schluss legen wir das Item noch in den Warenkorb
$quote->addItem($quoteItem);

// .. und speichern das Quote
$quote->save();

Wichtig ist das in der Magento 1.4.1.1 sowohl setCustomPrice als auch setOriginalCustomPrice aufgerufen wird da sonst z.B. Paypal oder die Rechnung nicht die richtigen Werte enthalten.



Ein Beitrag von Tobias Vogt
Tobias's avatar

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Seit 2016 ist er Mitgründer und CTO bei der connect-io GmbH, einer Magento-Agentur mit Sitz im idyllischen Paderborn-Salzkotten. Er gehört zum Gründer-Team der Webguys und ist seit November 2011 Bachelor of Science (Wirtschaftsinformatik). Sie erreichen Ihn per E-Mail unter tobi@webguys.de.

Alle Beiträge von Tobias

Kommentare
Matthias Kleine am

Hi Daniel,

dem komme ich doch gerne nach:

http://www.webguys.de/magento/ein-produkt-mehrfach-den-warenkorb-legen/

Daniel am

Über die Google-Suche bin ich auf diesen Eintrag gestoßen. Ich beschäftige mich frisch mit Magento und möchte folgendes lösen:

Es soll möglich sein, ein und dasselbe Produkt mehrmals in den Warenkorb zu legen, ohne dass es dann zu einem einzigen Produkt zusammengerechnet wird.

Vielleicht könnte das ja irgendwann mal behandelt werden.

Visahl am

Hi I am using these code in my observer. my observer is called but getting an error. can you please look into it and give me solution for this.

Code in observer:

public function addCustomOptionPrice($observer) { $Quote = Mage::getSingleton('checkout/session')->getQuote(); $product = $observer->getEvent()->getProduct(); $QuoteItem = Mage::getModel('sales/quote_item')-> setProduct($product); $QuoteItem-> setQuote($quote); $QuoteItem->setQty(1); $QuoteItem->setCustomPrice(10); $QuoteItem->setOriginalCustomPrice(20); $Quote->addItem($quoteItem); $Quote->save(); }

Error :

Fatal error: Call to a member function getId() on a non-object in /home/phpsyms/public_html/phpsyms.info/magento/app/code/core/Mage/Sales/Model/Quote/Item.php on line 239

Thanks Vishal

Andy am

Egal was, bei dem ersten Artikel löscht er den ursprünglich hinzugefügten Artikel NICHT. Kommen weitere hinzu, verschwinden diese und die neuen mit den gesonderten Preisen bleiben bestehen.

Warum muss da erst noch ein weiter Artikel hinzugefügt werden? Wie kann man gleich von Beginn an, den ursprünglichen Artikel entfernen und den soeben neu angelegten behalten? Ich habe allerhand Möglichkeiten probiert, nur leider blieben diese ohne oder nur bei einem Teilerfolg.

LG Andy

Andy am

Hallo Tobias,

hab vielen Dank. Jetzt wird der Artikel (im Magento 1.6.x) doppelt hinzugefügt. Mal schauen wie man den Originalen Artikel entfernt, aber das sollte jetzt das geringste Problem sein. Zumindest bekommt ich jetzt den Preis wie ich ihn haben möchte und benötige, nachträglich geändert.

LG Andy

Andreas H. am

Hallo Tobias

Wir möchten aus dem Warenkorb (resp. den gesammelten Produkten) eine zusätzliche Liste in HTML generieren können und wenn möglich in einem neuen Tab öffen können. Diese neue Liste weicht dann ein bisschen von der Warenkorbliste ab und muss nicht weiter im Bestellprozess verwendbar sein, sozusagen eine Sackgasse :-) -> BSP: die Zwischensumme und die Menge nicht mehr drin, auch das "bearbeiten" fällt weg, hinzu kommt ein neues Bild.

Meine Frage generell an dich: Ist das überhaupt möglich - und wenn ja, wie schwer schätzt du das ein (Skala 1-10 --> 10 am schwierigsten) Danke für deine Hilfe.

Tobias Vogt am

Jop, eigentlich tut der :) Zumindest hier in der 1.6.1 im Event checkout_cart_product_add_after (oder ähnlich)

Julian Bayer am

Hallo Tobias,

weißt Du zufällig, ob dieser Code auch mit der aktuellen Community Edition funktioniert?

Gruß, Julian

Tobias Vogt am

Hey Simon,

also so direkt geht das nicht. Du müsstest dann entweder den Preis je Stück so umrechnen das eines quasi Gratis ist oder ein anderes Item zusätzlich Gratis in den Warenkorb legen.

Bei Änderungen im Warenkorb musst du dann natürlich noch überprüfen ob das Produkt weiterhin im Warenkorb liegen darf :)

Tobi

Simon Sprankel am

Ist es denn auch möglich, für ein Quote Item mit der Menge 2 den Preis nur für das eine Item anzupassen? Ein Item soll z.B. kostenlos sein und das andere soll normal berechnet werden... Geht das irgendwie?

Viele Grüße und Danke vorab, Simon

Tobias Vogt am

Hey Andreas,

das ist leider nicht ganz so trivial. Du müsstest dazu mittels Event in Magento abfangen sobald ein Produkt in den Warenkorb gelegt wird und dann, je nachdem wo nach sich dein Preis richtet, diesen individuell für das Quote-Item setzen. Im Buch "Magento - Das Handbuch für Entwickler" findest du einen ähnlichen Ansatz für Gratisartikel. Hier wird der "individueller Preis" für Gratisartikel auf Null gesetzt.

schönen Gruß

Tobi

Andreas am

Hi, kann mir noch jemand verraten, wo genau ich den Code einbinden kann? Habe jetzt ein wenig rumprobiert, aber leider ohne Erfolg...

Gruß Andreas

Tobias Vogt am

Hey Sven,

danke danke. Immer gern. Ein bisschen Beispiel-Code dazu:

$product = Mage::getModel('catalog/product')->load($product_id); $quoteItem = $quote->getItemByProduct($product); $quoteItem->setOriginalCustomPrice(0); $quoteItem->setCustomPrice(0); $quoteItem->save();

Alternativ schaue dir doch einmal das Beispiel Webkochshop_Gratisartikel aus dem Magento-Entwickler-Handbuch an: http://examples.oreilly.de/german_examples/magentopaiger/

Sven am

Hi Tobias, danke für deinen Weihnachtskalender :)

Weißt Du vielleicht, wie ich ein quoteItem bearbeiten kann, welches bereits im Warenkorb liegt? Das einzige was klappt ist die Menge zu ändern per setQty()... Ich versuche nachträglich noch eine CustomOption hinzuzufügen, die dem simple-product noch gar nicht zugeordnet ist, also temporär quasi.

Gruß Sven

Dein Kommentar