Hello everyone,
I have a question about a custom plugin from a third party for free products.
I have the plugin installed and works as should. It adds a free product (without coupon code) on my cart.
But I also have other coupon codes for other discounts.
Whenever someone uses the other coupon code, the free products should be deleted and the entered coupon code should be applied.
Example:
Someone adds a product to the cart. Automatically the free product is entered to the cart and will be displayed.
But the customer doesn't want the free product but wants a discount. He/she enters the coupon code "discount" and the free products will be deleted from the cart en the discount will be applied.
The code from the plugin is the following:
model/observer.php
<?php
/**
* Freeproduct Module
*
* This module can be used free of carge to extend a magento system. Any other
* usage requires prior permission of the code4business Software GmbH. The module
* comes without any kind of warranty.
*
* @category C4B
* @package C4B_Freeproduct
* @author Nikolai Krambrock <freeproduct@code4business.de>
* @copyright code4business Software GmbH
* @version 0.1.0
*/
class C4B_Freeproduct_Model_Observer {
/**
* Delete all free products that have been added through this module before.
* This is done before discounts are given in on the event
* 'sales_quote_collect_totals_before'.
*
* @param Varien_Event_Observer $observer
*/
public function salesQuoteCollectTotalsBefore(Varien_Event_Observer $observer) {
self::_resetFreeItems($observer->getEvent()->getQuote());
}
/**
* Add gifts to the cart, if the current salesrule is of simple action
* ADD_GIFT_ACTION. The rule has been validated before the event
* 'salesrule_validator_process' is thrown that we catch.
*
* @param Varien_Event_Observer $observer
*/
public function salesruleValidatorProcess(Varien_Event_Observer $observer) {
/* @var $quote Mage_Sales_Model_Quote */
$quote = $observer->getEvent()->getQuote();
/* @var $item Mage_Sales_Model_Quote_Item */
$item = $observer->getEvent()->getItem();
/* @var $rule Mage_SalesRule_Model_Rule */
$rule = $observer->getEvent()->getRule();
if ($rule->getSimpleAction() == C4B_Freeproduct_Model_Consts::ADD_GIFT_ACTION &&
!$item->getIsFreeProduct()) {
self::_handleGift($quote, $item, $rule);
}
}
/**
* Add a new simple action to the salesrule in the backen. In the combo-box
* you can now select 'Add a Gift' as one possible result of the given rule
* evaluation positive. Additionally you have to enter a sku of the gift that
* you want to make.
*
* @param Varien_Event_Observer $observer
*/
public function adminhtmlBlockSalesruleActionsPrepareform($observer) {
$field = $observer->getForm()->getElement('simple_action');
$options = $field->getValues();
$options[] = array(
'value' => C4B_Freeproduct_Model_Consts::ADD_GIFT_ACTION,
'label' => Mage::helper('freeproduct')->__('Add a Gift')
);
$field->setValues($options);
$fieldset = $observer->getForm()->getElement('action_fieldset');
$fieldset->addField('gift_sku', 'text', array(
'name' => 'gift_sku',
'label' => Mage::helper('freeproduct')->__('Gift SKU'),
'title' => Mage::helper('freeproduct')->__('Gift SKU'),
'note' => Mage::helper('freeproduct')->__('Enter the SKU of the gift that should be added to the cart'),
));
}
/**
* Make sure that a gift is only added once, create a free item and add it to the cart.
*
* @param Mage_Sales_Model_Quote $quote
* @param Mage_Sales_Model_Quote_Item $item
* @param Mage_Sales_Model_Quote_Item $rule
*/
protected static function _handleGift(Mage_Sales_Model_Quote $quote,
Mage_Sales_Model_Quote_Item $item,
Mage_SalesRule_Model_Rule $rule) {
if ($rule->getIsApplied()) {
return;
}
$qty = (integer) $rule->getDiscountAmount();
if ($qty) {
$freeItem = self::_getFreeQuoteItem($quote, $rule->getGiftSku(), $item->getStoreId(), $qty);
self::_addAndApply($quote, $freeItem, $rule);
}
}
/**
* Create a free item. It has a value of 0$ in the cart no matter what the price was
* originally.
*
* @param Mage_Sales_Model_Quote $quote
* @param string $sku
* @param int $storeId
* @param int $qty
* @return Mage_Sales_Quote_Item
*/
protected static function _getFreeQuoteItem(Mage_Sales_Model_Quote $quote, $sku, $storeId, $qty) {
if ($qty < 1) {
return;
}
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);
Mage::getModel('cataloginventory/stock_item')->assignProduct($product);
$quoteItem = Mage::getModel('sales/quote_item')->setProduct($product);
$quoteItem->setQuote($quote)
->setQty($qty)
->setCustomPrice(0.0)
->setOriginalCustomPrice($product->getPrice())
->setIsFreeProduct(true)
->setStoreId($storeId);
return $quoteItem;
}
/**
* Add a free item and mark that the rule was used on this item.
*
* @param Mage_Sales_Model_Quote $quote
* @param Mage_Sales_Model_Quote_Item $item
* @param Mage_Sales_Model_Quote_Item $rule
*/
protected static function _addAndApply(Mage_Sales_Model_Quote $quote,
Mage_Sales_Model_Quote_Item $item,
Mage_SalesRule_Model_Rule $rule) {
$quote->addItem($item);
$item->setApplyingRule($rule);
$rule->setIsApplied(true);
}
/**
* Delete all free items from the cart.
*
* @param Mage_Sales_Model_Quote $quote
*/
protected static function _resetFreeItems(Mage_Sales_Model_Quote $quote) {
foreach ($quote->getAllItems() as $item) {
if ($item->getIsFreeProduct()) {
$quote->removeItem($item->getId());
}
}
}
}model/consts.php
<?php
/**
* Freeproduct Module
*
* This module can be used free of carge to extend a magento system. Any other
* usage requires prior permission of the code4business Software GmbH. The module
* comes without any kind of warranty.
*
* @category C4B
* @package C4B_Freeproduct
* @author Nikolai Krambrock <freeproduct@code4business.de>
* @copyright code4business Software GmbH
* @version 0.1.0
*/
class C4B_Freeproduct_Model_Consts {
const ADD_GIFT_ACTION = 'add_gift';
}helper/data.php
<?php
/**
* Freeproduct Module
*
* This module can be used free of carge to extend a magento system. Any other
* usage requires prior permission of the code4business Software GmbH. The module
* comes without any kind of warranty.
*
* @category C4B
* @package C4B_Freeproduct
* @author Nikolai Krambrock <freeproduct@code4business.de>
* @copyright code4business Software GmbH
* @version 0.1.0
*/
class C4B_Freeproduct_Helper_Data extends Mage_Core_Helper_Abstract {
/**
* This logs a message in a custom log file.
*
* @param string $msg
*/
public function log($msg) {
Mage::log($msg, Zend_Log::INFO, 'freeproduct.log');
}
}
etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<C4B_Freeproduct>
<version>0.1.0</version>
</C4B_Freeproduct>
</modules>
<global>
<models>
<freeproduct>
<class>C4B_Freeproduct_Model</class>
</freeproduct>
</models>
<helpers>
<freeproduct>
<class>C4B_Freeproduct_Helper</class>
</freeproduct>
</helpers>
<resources>
<freeproduct_setup>
<setup>
<module>C4B_Freeproduct</module>
<class>Mage_Eav_Model_Entity_Setup</class>
</setup>
<connection>
<use>core_setup</use>
</connection>
</freeproduct_setup>
</resources>
<fieldsets>
<sales_convert_quote_item>
<is_free_product>
<to_order_item>is_free_product</to_order_item>
</is_free_product>
</sales_convert_quote_item>
</fieldsets>
</global>
<adminhtml>
<events>
<adminhtml_block_salesrule_actions_prepareform>
<observers>
<freeproduct>
<type>model</type>
<class>freeproduct/observer</class>
<method>adminhtmlBlockSalesruleActionsPrepareform</method>
</freeproduct>
</observers>
</adminhtml_block_salesrule_actions_prepareform>
</events>
<translate>
<modules>
<C4B_Freeproduct>
<files>
<default>C4B_Freeproduct.csv</default>
</files>
</C4B_Freeproduct>
</modules>
</translate>
</adminhtml>
<frontend>
<layout>
<updates>
<freeproduct>
<file>freeproduct.xml</file>
</freeproduct>
</updates>
</layout>
<events>
<salesrule_validator_process>
<observers>
<freeproduct>
<type>model</type>
<class>freeproduct/observer</class>
<method>salesruleValidatorProcess</method>
</freeproduct>
</observers>
</salesrule_validator_process>
<sales_quote_collect_totals_before>
<observers>
<freeproduct>
<type>model</type>
<class>freeproduct/observer</class>
<method>salesQuoteCollectTotalsBefore</method>
</freeproduct>
</observers>
</sales_quote_collect_totals_before>
<!-- CUSTOM PART TO REMOVE FREE PRODUCTS IF COUPON CODE IS ENTERED
<controller_action_predispatch_checkout_cart_couponPost>
<observers>
<freeproduct>
<type>singleton</type>
<class>freeproduct/observer</class>
<method>salesQuoteCollectTotalsBefore</method>
</freeproduct>
</observers>
</controller_action_predispatch_checkout_cart_couponPost>
<!-- END CUSTOM PART //-->
</events>
</frontend>
</config>sql/freeproduct_setup/mysql-install-0.1.0.php
<?php
/**
* Freeproduct Module
*
* This module can be used free of carge to extend a magento system. Any other
* usage requires prior permission of the code4business Software GmbH. The module
* comes without any kind of warranty.
*
* @category C4B
* @package C4B_Freeproduct
* @author Nikolai Krambrock <freeproduct@code4business.de>
* @copyright code4business Software GmbH
* @version 0.1.0
*/
/**
* @var $installer Mage_Sales_Model_Mysql4_Setup
*/
$installer = $this;
$installer->startSetup();
$installer->getConnection()->addColumn($installer->getTable('sales/quote_item'), 'is_free_product', "tinyint(4) NOT NULL default '0'");
$installer->getConnection()->addColumn($installer->getTable('sales/order_item'), 'is_free_product', "tinyint(4) NOT NULL default '0'");
$installer->getConnection()->addColumn($installer->getTable('salesrule'), 'gift_sku', "varchar(255) NOT NULL default ''");
$installer->endSetup();
Thanks in advance!