Posting in the Magento forums has been disabled pending the implementation of a new and improved forum solution which should better serve the community.

For new questions please post at magento.stackexchange.com, the community-run support site for the Magento community. We will be providing updates on the new forum solution soon. For questions or concerns please email community@magento.com.

Magento Forum

Gratisartikel bei der Berechnung der Versandkosten nicht berücksichtigen
 
cads
Member
 
Total Posts:  47
Joined:  2010-07-09
 

Hallo,

in meinem Shop ist die Lieferung ab einem Bestellwert von 75 € versandkostenfrei.

Nun möchte ich meinen Kunden einen Gratisartikel in den Warenkorb legen, wenn diese ein bestimmtes Produkt kaufen.

Damit das Produkt gratis ist, erzwinge ich einen Preis von Null, auch wenn das Produkt eigentlich einen anderen Preis hat:

quoteItem->setOriginalCustomPrice(0);

Dies klappt soweit auch prima. Allerdings wird bei der Berechnung der Versandkosten immer noch der Originalpreis des Gratisartikels verwendet.
Wenn der Kunden also ein Produkt für 70 € kauft und ich einen Artikel gratis hinzufüge, der eigentlich 10 € kosten würde, dann wird bei der Berechnung der Versandkosten fälschlicherweise von 80 € statt 70 € ausgegangen und die Bestellung ist somit versandkostenfrei.

Hat jemand einen Tipp, wie man den Preis für den Gratisartikel auch für die Berechnung der Versandkosten auf Null setzen kann?

Gruß Christian

 
Magento Community Magento Community
Magento Community
Magento Community
 
Siggi_Schmitz
Enthusiast
 
Avatar
Total Posts:  811
Joined:  2011-07-03
 

Erklär bitte etwas genauer wie du das Gratisprodukt hinzufügst, also wie / wann wird zb.

quoteItem->setOriginalCustomPrice(0);

aufgerufen?

 
Magento Community Magento Community
Magento Community
Magento Community
 
cads
Member
 
Total Posts:  47
Joined:  2010-07-09
 
Siggi_Schmitz - 10 December 2012 11:06 AM

Erklär bitte etwas genauer wie du das Gratisprodukt hinzufügst, also wie / wann wird zb.

quoteItem->setOriginalCustomPrice(0);

aufgerufen?

Hallo Siggi,

zunächst einmal Danke dafür, dass Du Dich meines Problems annimmst, da ich noch keine Lösung dafür gefunden habe.

Um die Funktionalität zu realisieren, nutze ich das Event sales_quote_save_before, das immer vor dem Speichern des Quote-Models ausgelöst wird.
Die Methode der Observer-Klasse sieht zurzeit folgendermaßen aus (die vollständige Klasse habe ich als Attachment angehängt):

/**
     * Anlegen oder Löschen des Gratisartikels abhängig von der Anzahl.
     * Wenn $qty == 0: Gratisartikel entfernen
     * Wenn $qty >= 1: Gratisartikel auf Ã¼bergebene Anzahl setzen.
     *
     * @param Mage_Sales_Model_Quote $quote
     * @param int $qty
     * @return null
     */
    protected function _setFreeProductOnQuote(Mage_Sales_Model_Quote $quote$qty 1)
    
{
        $sku  
Mage::getStoreConfig('gratis/general/free_product_sku');
        
$code Mage::getStoreConfig('gratis/general/coupon_code');

        
/*
         * Eingelöster Gutschein entspricht Gratisartikel
         */        
        
if ($code == $quote->getCouponCode())
        
{
            
try
            
{
                
/*
                 * Fallbehandlung: Gratisartikel ist bereits im Warenkorb vorhanden
                 */
                
foreach ($quote->getAllItems() as $item)
                
{
                    
if ($this->_isQuoteItemFreeProduct($item))
                    
{
                        
if ($qty == 0)
                        
{
                            $quote
->removeItem($item->getId());
                        
}
                        
elseif ($item->getQty() != $qty)
                        
{
                            $item
->setQty($qty);
                        
}
                        
return;
                    
}
                }

                
/*
                 * Fallbehandlung: Gratisartikel ist noch nicht im Warenkorb vorhanden
                 */
                
if ($qty 0)
                
{
                    
/*
                     * Produkt ist noch nicht im Warenkorb - Hinzufügen des Artikels
                     */
                    
if ($product Mage::getModel('catalog/product')->loadByAttribute('sku'$sku))
                    
{
                        
if ($product->getId())
                        
{
                            
/*
                             * Laden der Inventar-Daten des Produktes
                             */
                            
Mage::getModel('cataloginventory/stock_item')->assignProduct($product);

                            
/*
                             * Hinzufügen des Artikels zum Warenkorb
                             */
                            
$quote->addProduct($product$qty);
                            
$quoteItem $quote->getItemByProduct($product);

                            
/*
                             * Erzwingen eines Preises auch wenn das Produkt einen anderen Preis hat
                             * Bis Magento 1.4.0.1 muss setCustomPrice() verwendet werden.
                             * Ab  Magento 1.4.1.1 muss setOriginalCustomPrice() verwendet werden.
                             */
                            
if (version_compare(Mage::getVersion(), '1.4.1.1''<'))
                            
{
                                $quoteItem
->setCustomPrice(0);
                            
}
                            
else
                            
{
                                $quoteItem
->setOriginalCustomPrice(0);
                            
}

                            
/*
                             * Dem Kunden sollen keine zusätzlichen Versandkosten durch den Gratisartikel entstehen
                             */
                            
$quoteItem->setFreeShipping($qty);

                            
/*
                             * Setzen einer Custom Option zur Anzeige eines Zusatztextes
                             */
                            
$labelText Mage::getStoreConfig('gratis/general/free_label');
                            
$options = array(array(
                                
'label' => $labelText,
                                
'value' => '',
                                
'print_value' => '',
                            ));

                            
$quoteItem->addOption(array(
                                
'code' => 'additional_options',
                                
'value' => serialize($options),
                            ));

                            
/*
                             * Event dispatchen damit ggf. benötigte Observer die Ã„nderung im Warenkorb mitbekommen
                             */
                            
Mage::dispatchEvent('checkout_cart_product_add_after', array('quote_item' => $quoteItem'product' => $product));
                        
}
                    }
                }
            }
            
catch (Mage_Core_Exception $e)
            
{
                Mage
::getSingleton('core/session')->addError($e->getMessage());
            
}
        }
        
else
        
{
            
try
            
{
                
foreach ($quote->getAllItems() as $item)
                
{
                    
if ($this->_isQuoteItemFreeProduct($item))
                    
{
                        $quote
->removeItem($item->getId());
                        return;
                    
}
                }                
            }
            
catch (Mage_Core_Exception $e)
            
{
                Mage
::getSingleton('core/session')->addError($e->getMessage());
            
}        
        }
    }
File Attachments
Observer.php  (File Size: 5KB - Downloads: 25)
 
Magento Community Magento Community
Magento Community
Magento Community
Magento Community
Magento Community
Back to top