Kurzinfo


Andreas von Studnitz

mehr »

Andreas von Studnitz arbeitet seit 2012 als Geschäftsführer und Entwickler für die Magento-Agentur integer_net GmbH. Aktuelle Informationen finden Sie unter www.integer-net.de

Kontakt

Bitte kontaktieren Sie mich über die Website von integer_net.

mehr »

< Magento: Anlegen einer Rechnung zu einer Bestellung

Magento: Aufsplitten der Warenkorb-Produkte in einzelne Zeilen

24.05.2010 14:11

Zugegeben eine auf den ersten Blick merkwürdige Anforderung: Wenn x (zwei oder mehr) identische Produkte im Warenkorb sind, sollen diese nicht in einer Zeile mit der Menge x erscheinen, sondern in x einzelnen Zeilen mit jeweils der Menge 1. Der Grund dahinter: Zu jedem einzelnen Produkt soll der Kunde eine getrennte Geschenknachricht eingeben können. Das geht im Standard nur einmal pro Zeile.

Um dies zu erreichen, wird zunächst die Methode addProduct der Klasse Mage_Checkout_Model_Cart angepasst, die für das Hinzufügen von Produkten zum Warenkorb zuständig ist:

/**
* Add product to shopping cart (quote); if qty > 1 create x items
*
* @param int $productId
* @param int $qty
* @return Mage_Checkout_Model_Cart
*/
public function addProduct($product, $info=null)
{

$product = $this->_getProduct($product);
$request = $this->_getProductRequest($info);


if ($product->getId()) {

// store original quantity and set request quantity to 1 so each item line just contains 1 product
$qty = max(1, $request->getQty());
$request->setQty(1);

// add as many item lines as products should be added
for ($i = 1; $i <= $qty; $i++) {

$result = $this->getQuote()->addProduct($product, $request);

/**
* String we can get if prepare process has error
*/
if (is_string($result)) {

$this->getCheckoutSession()->setRedirectUrl($product->getProductUrl());
if ($this->getCheckoutSession()->getUseNotice() === null) {
$this->getCheckoutSession()->setUseNotice(true);
}
Mage::throwException($result);
}
}
}
else {
Mage::throwException(Mage::helper('checkout')->__('Product does not exist'));
}

Mage::dispatchEvent('checkout_cart_product_add_after', array('quote_item'=>$result, 'product'=>$product));
$this->getCheckoutSession()->setLastAddedProductId($product->getId());
return $this;
}

Dies löst nur das halbe Problem - wenn im Warenkorb die Menge geändert wird, muss auch hier die Aufteilung auf mehrere Zeilen passieren. Dafür wird die Methode setQty der Klasse Mage_Sales_Model_Quote_Item wie folgt angepasst:

/**
* Declare quote item quantity; duplicate items if qty > 1
*
* @param float $qty
* @return Mage_Sales_Model_Quote_Item
*/
public function setQty($qty)
{

$qty = $this->_prepareQty($qty);

if ($qty > 1) {

$this->setData('qty', 1);

for ($i = 1; $i < $qty; $i++) {

$newItem = clone $this;
$this->getQuote()->addItem($newItem);
}

} else {

$this->setData('qty', $qty);
}

return $this;
}

Praktisch dabei: Diese Methode wird auch dafür verwendet, wenn zwei Warenkörbe ("Quotes") vereinigt werden, z.B. wenn der Kunde sich erst einloggt, nachdem er schon Produkte in den Warenkorb gelegt hat.

Kommentare