我已经在Magneto中添加了新规则来购买x产品并获得免费。我添加了一个包含多个简单产品的可配置产品。如果我购买两个具有相同sku值的简单产品,此规则可以正常工作。我想要的是,如果用户购买两个具有不同sku的简单产品,他们应该获得第二个免费。 我怎样才能做到这一点?
答案 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 * price
和item_qty * base_price
的折扣金额和基本折扣金额。您需要在传递给观察者方法的数据中的result
对象上设置这些值,如:
$item = $observer->getEvent()->getItem();
$result = $observer->getEvent()->getResult();
$result->setDiscountAmount($item->getQty * $item->getPrice());
$result->setBaseDiscountAmount($item->getQty * $item->getBasePrice());