gpt4 book ai didi

php - Magento - 修改产品属性后重新分配目录规则

转载 作者:可可西里 更新时间:2023-10-31 23:43:30 27 4
gpt4 key购买 nike

我正在为 Magento 1.5.1.0 开发一个扩展,它允许我为库存数量减少到零的产品添加目录价格规则。我在我的属性集中添加了一个名为 auto_discount_active 的属性。此属性是我的开/关开关,用作我的价格规则的条件。

我编写了一个 Observer,它对事件 sales_order_place_aftercatalog_product_save_before 使用react。它的任务是检查当前产品的库存数量是否已更改,并将我的自定义属性设置为打开或关闭。

处理 catalog_product_save_before 事件的方法工作正常。在后端保存一篇文章后,价格规则会像它应该的那样变得(不)活跃。代码如下所示:

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;
}

在下订单并在后台手动保存购买的商品后,价格规则会更新。但是我已经在我的观察者方法中进行了更新。

更改自定义属性后,我需要做什么才能分配目录价格规则?

提前致谢!

最佳答案

好的,我想就一些相当重要的代码优化向您提出建议。

您可以减少集合大小并删除循环内的条件逻辑,方法是:

$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);

此外,请记住,您还需要将您的观察员应用于任何产品库存水平的修改,即。产品保存、导入、贷项通知单(退款)——因此它是一个相当广阔的领域。重写 stock 类可能会更好,因为没有太多事件派发给你足够的范围来涵盖这个。

最后,为了执行规则分配,我建议扩展规则的资源模型 (Mage/CatalogRule/Model/Mysql4/Rule.php) 以便您可以传入数组产品 ID(以保存它遍历整个目录)。

您可以简单地扩展 getRuleProductIds() 以获取一个 Mage::registry 变量(如果已设置)以及您从上述集合中获取的产品 ID。然后在运行上面的代码后,你可以执行

Mage::getModel('catalogrule/rule')->load(myruleid)->save();

这将根据需要重新编制索引并将规则应用于新产品 - 仅适用于已更改的产品。

我认为这种方法可以极大地减少管理费用。

关于php - Magento - 修改产品属性后重新分配目录规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7387901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com