我正在尝试在自定义模块中实现一个简单的观察者,以便在加载时更新产品库存。
这是xml文件的内容:
<?xml version="1.0"?>
<config>
<modules>
<Foo_Bar>
<version>0.1</version>
</Foo_Bar>
</modules>
<global>
<models>
<updatestock>
<class>Foo_Bar_Model</class>
</updatestock>
</models>
<events>
<catalog_product_load_before>
<observers>
<Foo_Bar>
<type>model</type>
<class>updatestock/observer</class>
<method>updatestock</method>
</Foo_Bar>
</observers>
</catalog_product_load_before>
</events>
</global>
</config>
以下是观察者模型的内容:
class Foo_Bar_Model_Observer extends Mage_Core_Model_Abstract {
public function updatestock($observer) {
$product = $observer->getProduct();
$product->setQty(555);
$product->save();
}
}
问题是股票没有保存;有什么可以解决这个问题?
感谢您的帮助。
修改:
我认为问题来自:
<catalog_product_load_before>
产品尚未加载,我收到404 Not found页面,但当我将其替换为:
<catalog_product_load_after>
产品库存已正确更新,但当产品库存可用性为“缺货”且库存为0时;前端的“可用性”总是“缺货”,“添加到购物车按钮”被隐藏(这意味着加载的库存为0)。
我尝试过“<catalog_product_load_before>
”,但在这种情况下,我无法获得产品ID或SKU。
感谢您的帮助
答案 0 :(得分:1)
$product->getStockItem()
->setData('qty', $qty)
->save();
答案 1 :(得分:0)
使用事件catalog_product_load_before并在观察者中使用以下代码:
$productId = $observer->getValue();
$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
$stockItem->setData('qty',555);
$stockItem->save();
答案 2 :(得分:0)
您可以使用以下方式加载产品:
$productId = $observer->getProduct()->getId();
$stockItem =Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
$stockItem->setData('qty', (integer)$stockAmount);
$stockItem->save();
就是这样:))
答案 3 :(得分:0)
产品库存通过CatalogInventory模块处理。
试试这个:
class Foo_Bar_Model_Observer {
public function updatestock($observer) {
$product = $observer->getProduct();
$stock = $product->getStockItem();
$stock->setQty(555);
$stock->save();
$product->save();
}
}
此外,您不需要在观察者上扩展Mage_Core_Model_Abstract。只是想在系统中保存一点内存;)
答案 4 :(得分:0)
尝试
$product = productId = $observer->getProduct();
$stockItem = Mage::getModel('cataloginventory/stock_item');
$stockItem->assignProduct($product);
$stockItem->setData('is_in_stock', 1);
$stockItem->setData('qty', 5555);
$product->setStockItem($stockItem);
$product->save();
答案 5 :(得分:0)
如果您想从后端保存产品后$productobj
,则可以轻松使用catalog_product_save_after
事件。
我假设您已经知道如何在M2
中创建一个模块。
现在您需要为M2开发新模块
然后在下面的路径中创建此events.xml
文件
app\code\YOUR_NAMESPACE\YOURMODULE\etc\adminhtml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="catalog_product_save_after">
<observer name="test_name" instance="YOUR_NAMESPACE\YOUR_MODULENAME\Observer\Productsaveafter" />
</event>
</config>
然后在路径下方创建观察者文件Productsaveafter.php
app \ code \ YOUR_NAMESPACE \ YOURMODULE \ Observer \
<?php
namespace YOURNAMESPACE\YOURMODULENAME\Observer;
use Magento\Framework\Event\ObserverInterface;
class Productsaveafter implements ObserverInterface
{
public function execute(\Magento\Framework\Event\Observer $observer)
{
$product = $observer->getEvent()->getProduct();
$id = $product->getId(); //Get Product Id
//Get Quantity
$stockItem = $product->getExtensionAttributes()->getStockItem();
$stockData = $stockItem->getQty();
// Get new Qty
$_vendor_qty = $product->getVendorQty();
$_on_hand_qty = $product->getOnHandQty();
$totalQty = $_vendor_qty+$_on_hand_qty; //Add New Qty
$stockItem->setQty($totalQty); //Set New Qty to Main Qty
$stockItem->save();
}
}