Magento购买X获得Y免费价格规则

时间:2014-05-30 07:42:26

标签: magento magento-1.8

我已经在Magneto中添加了新规则来购买x产品并获得免费。我添加了一个包含多个简单产品的可配置产品。如果我购买两个具有相同sku值的简单产品,此规则可以正常工作。我想要的是,如果用户购买两个具有不同sku的简单产品,他们应该获得第二个免费。 我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

使用购物车规则的默认实现无法做到这一点。您需要创建新模块并将自己的规则类型添加到列表中。我曾用以下方式制作过这样一个模块:

1)我将自己的选项添加到操作下拉列表中。幸运的是,有一个事件adminhtml_block_salesrule_actions_prepareform,你可以挂钩。我用过这样的东西

$form = $observer->getEvent()->getForm();
$options = $form->getElement('simple_action')->getValues();
$options[] = array(
    'value' => self::BUY_ANY_X_GET_Y_ACTION,
    'label' => Mage::helper('mymodule')->__('Extended Buy X get Y free (search all cart, discount amount is Y)'),
);
$form->getElement('simple_action')->setValues($options);

2)然后我挂钩salesrule_validator_process,检查购物车是否符合规则。 这有点棘手,因为为每个购物车项目运行此验证器,因此您必须计算它被调用的次数以及您检查的项目。我使用条件选项卡来准备规则,说明必须购买哪些X项目才能根据操作选项卡中的条件获取Y项目。 首次运行验证程序时,您将遍历所有购物车集合并将所有产品分为两组:一个包含符合条件选项卡设置的条件的项目,第二个符合操作选项卡设置的条件。换句话说,您形成两个数组,其中包含X项和Y项。

foreach($quote->getItemsCollection() as $item) {

    if (!$item->hasParentItemId()) {
        if ($rule->getActions()->validate($item)) {
            $ruleItems['y'][] = $item;
        }

        foreach($rule->getConditions()->getConditions() as $condition) {
            foreach($condition->getConditions() as $check) {
                if ($check->validate($item)) {
                    $ruleItems['x'][] = $item;
                }
            }
        }                
    }
}

您可以计算出有多少X,以及有多少Y系列商品会获得折扣。为每个项目调用事件时,检查项目是否在Y数组中,以及是否有足够的折扣为该项目。如果是这样,您需要设置分别计算为item_qty * priceitem_qty * base_price的折扣金额和基本折扣金额。您需要在传递给观察者方法的数据中的result对象上设置这些值,如:

$item = $observer->getEvent()->getItem();
$result = $observer->getEvent()->getResult();
$result->setDiscountAmount($item->getQty * $item->getPrice());
$result->setBaseDiscountAmount($item->getQty * $item->getBasePrice());