默认的Magento中有个很棒的功能叫做“促销”。有两种类型的促销:目录价格跪着和购物车价格规则。这篇文章中我将演示如何以编程的方式来创建,应用和删除购物车价格规则。

有很多理由让你使用它。例如:你想模拟某种奖励功能,对达到要求的客户进行打折。除非正在使用Magento EE就不用了(带有奖励积分的功能),那么你将编写代码或者购买第三方插件。我个人不太喜欢用第三方插件,除非它是必须的或者能达到功能需求的90-95%。否则你将花费时间在修改插件上。让我们看看我们如何自己实现这个功能。一种方式是用代码粉方式创建和应用购物车价格规则,然后在执行的时候删除购物车价格规则。

首先,我们创建购物车价格规则。我们将以手动创建一个规则,然后学习后台进程来以编程的方式来复制它。我们将进入Magento后台,在“Promotions > Shopping Cart Price Rules”下,点击“Add New Rule”右上角按钮。在这个例子中,我们将限制一个客户每次只能使用一个优惠券。我们填上必须字段并用POST变量提交数据,最后的url会像这样:http://shop.net/index.php/admin/promo_quote/save/

form_key => YYhUwcLXX6sezYPY
product_ids => 
name => CUSTOMER_1 - 30% Summer discount
description => 
is_active => 1
website_ids[] => 1
customer_group_ids[] => 3
coupon_type => 2
coupon_code => leIYc4g1dbCCOlT1
uses_per_coupon => 1
uses_per_customer => 1
from_date => 
to_date => 
sort_order => 
is_rss => 1
rule[conditions][1][type] => salesrule/rule_condition_combine
rule[conditions][1][aggregator] => all
rule[conditions][1][value] => 1
rule[conditions][1][new_child] => 
simple_action => by_percent
discount_amount => 30
discount_qty => 0
discount_step => 
apply_to_shipping => 0
simple_free_shipping => 0
stop_rules_processing => 0
rule[actions][1][type] => salesrule/rule_condition_product_combine
rule[actions][1][aggregator] => all
rule[actions][1][value] => 1
rule[actions][1][new_child] => 
store_labels[0] => 
store_labels[1] => 

现在,如果我们研究http://shop.net/index.php/admin/promo_quote/save/ 后面的Mage_Adminhtml_Promo_QuoteController -> saveAction(),我们可以看到规则的创建:

$data = array(
    'product_ids' => null,
    'name' => sprintf('AUTO_GENERATION CUSTOMER_%s - 30%% Summer discount', Mage::getSingleton('customer/session')->getCustomerId()),
    'description' => null,
    'is_active' => 1,
    'website_ids' => array(1),
    'customer_group_ids' => array(1),
    'coupon_type' => 2,
    'coupon_code' => Mage::helper('core')->getRandomString(16),
    'uses_per_coupon' => 1,
    'uses_per_customer' => 1,
    'from_date' => null,
    'to_date' => null,
    'sort_order' => null,
    'is_rss' => 1,
    'rule' => array(
        'conditions' => array(
            array(
                'type' => 'salesrule/rule_condition_combine',
                'aggregator' => 'all',
                'value' => 1,
                'new_child' => null
            )
        )
    ),
    'simple_action' => 'by_percent',
    'discount_amount' => 30,
    'discount_qty' => 0,
    'discount_step' => null,
    'apply_to_shipping' => 0,
    'simple_free_shipping' => 0,
    'stop_rules_processing' => 0,
    'rule' => array(
        'actions' => array(
            array(
                'type' => 'salesrule/rule_condition_product_combine',
                'aggregator' => 'all',
                'value' => 1,
                'new_child' => null
            )
        )
    ),
    'store_labels' => array('30% Summer discount')
);
 
$model = Mage::getModel('salesrule/rule');
$data = $this->_filterDates($data, array('from_date', 'to_date'));
 
$validateResult = $model->validateData(new Varien_Object($data));
 
if ($validateResult == true) {
 
    if (isset($data['simple_action']) && $data['simple_action'] == 'by_percent'
            && isset($data['discount_amount'])) {
        $data['discount_amount'] = min(100, $data['discount_amount']);
    }
 
    if (isset($data['rule']['conditions'])) {
        $data['conditions'] = $data['rule']['conditions'];
    }
 
    if (isset($data['rule']['actions'])) {
        $data['actions'] = $data['rule']['actions'];
    }
 
    unset($data['rule']);
 
    $model->loadPost($data);
 
    $model->save();
}

上面涵盖了“create”部分,现在让我们转到应用部分。想法是:在执行chechout之前以编程的方式来应用优惠券。如果我们在像http://shop.net/checkout/cart/这样的url里应用优惠券,表单可能提交数据到http://shop.net/checkout/cart/couponPost/的controller动作。

提交数据非常简单:

remove => 0
coupon_code => da4K53cGuhNoTc10

现在,让我们看看http://shop.net/checkout/cart/couponPost/后面的controller动作。我们要看得更远点,我们将先寻找之前我们创建的特殊规则名。当筛选出特殊的数据check等等时。你留下类似“apply Shopping Cart Price Rule”代码的东西。

/* START This part is my extra, just to load our coupon for this specific customer */
$model = Mage::getModel('salesrule/rule')
        ->getCollection()
        ->addFieldToFilter('name', array('eq'=>sprintf('AUTO_GENERATION CUSTOMER_%s - 30%% Summer discount', Mage::getSingleton

('customer/session')->getCustomerId())))
        ->getFirstItem();
 
$couponCode = $model->getCouponCode();
/* END This part is my extra, just to load our coupon for this specific customer */
 
Mage::getSingleton('checkout/cart')
    ->getQuote()
    ->getShippingAddress()
    ->setCollectShippingRates(true);
 
Mage::getSingleton('checkout/cart')
    ->getQuote()
    ->setCouponCode(strlen($couponCode) ? $couponCode : '')
    ->collectTotals()
    ->save();

现在我们需要做的就是这个代码转移到合适的位置,像事件观察。最后一旦客户结账完成,我们就用一个简单的代码删除这个规则。

$model = Mage::getModel('salesrule/rule')
        ->getCollection()
        ->addFieldToFilter('name', array('eq'=>sprintf('AUTO_GENERATION CUSTOMER_%s - 30%% Summer discount', Mage::getSingleton('customer/session')->getCustomerId())))
        ->getFirstItem();
 
$model->delete();

360magento提供专业的基于magento系统的电商网站开发服务,如有需求或相关咨询,请与我们联系