php – Magento – 修改产品属性后重新分配目录规则
我正在为Magento 1.5.1.0开发一个扩展程序,它允许我将产品目录价格规则添加到库存数量减少到零的产品中.我在属性集中添加了一个名为auto_discount_active的属性.此属性是我的开/关开关,它作为我的定价规则的条件.
我写了一个Observer,对事件sales_order_place_after和catalog_product_save_before作出反应.它的任务是检查当前产品的库存数量是否已更改,并将我的自定义属性设置为打开或关闭. 处理catalog_product_save_before事件的方法工作正常.在后端保存文章后,价格规则变为(in)活动状态.代码如下所示: class Company_AutoDiscount_Model_Observer { public function updateAutoDiscount($observer) { /** * @var Varien_Event */ $event = $observer->getEvent(); $product = $event->getProduct(); $data = $product->getStockData(); $discount = $data['qty'] < 1 ? true : false; $attributes = $product->getAttributes(); $attribute = $attributes["auto_discount_active"]; if ($product->getAutoDiscountAllowed()) { $product->setAutoDiscountActive($discount); } return $this; } } 如果有人在我的商店下订单,现在我想做同样的事情.那是因为我使用了迄今为止有效的事件sales_order_place_after.但在更改自定义属性值后,价格规则不会更新.我的观察者方法如下所示: public function updateAutoDiscountAfterOrder($observer) { /** * @var Varien_Event */ $event = $observer->getEvent(); $order = $event->getOrder(); foreach ($order->getItemsCollection() as $item) { $productId = $item->getProductId(); $productIds[] = $productId; $product = Mage::getModel('catalog/product')->setStoreId($order->getStoreId())->load($productId); $data = $product->getStockData(); $discount = $data['qty'] < 1 ? true : false; if ($product->getAutoDiscountAllowed()) { $product->setAutoDiscountActive($discount); $product->save(); } Mage::getModel('catalogrule/rule')->applyAllRulesToProduct($productId); } return $this; } 下订单并在后端手动保存购买的商品而不进行更改后,价格规则会更新.但我已经在我的观察者方法中使用了更新. 更改自定义属性后,如何才能分配目录价格规则? Thx提前! 解决方法
好的,我想就一些相当重要的代码优化建议你.
您可以使用以下命令减少集合大小并删除循环中的条件逻辑: $order->getItemsCollection()->addFieldToFilter('is_in_stock',0); 您还可以使用比save()更快的方法更新所有属性,方法是: Mage::getSingleton('catalog/product_action') ->updateAttributes($order->getItemsCollection()->addFieldToFilter('is_in_stock',0)->getAllIds(),array('auto_discount_active' => 1),0); 另外,请记住,您还需要将您的观察者应用于任何产品库存水平修改,即.产品保存,导入,贷项凭证(退款) – 所以它是一个相当广阔的领域.你可能会更好地重写股票类,因为没有太多的事件发送会给你足够的空间来覆盖这个. 最后,为了执行规则的分配,我建议扩展规则的资源模型(Mage / CatalogRule / Model / Mysql4 / Rule.php),以便您可以传入产品ID数组(以保存它迭代通过整个目录). 您可以简单地扩展getRuleProductIds()以使用上面集合中的产品ID获取Mage :: registry变量(如果已设置).然后运行上面的代码后,您就可以执行了 Mage::getModel('catalogrule/rule')->load(myruleid)->save(); 这将根据需要重新索引并将规则应用于新产品 – 仅针对已更改的产品. 我会想象这种方法可以节省大量的开销. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |