我试图实现一个简单的观察者在自定义模块更新产品库存时,它被加载。
这是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未找到的页面,但当我替换它:
<catalog_product_load_after>
产品库存已正确更新,但当产品库存可用性为"缺货"且库存为0时;"可用性"在前端总是"缺货"one_answers"添加到购物车按钮"是隐藏的(这意味着加载的库存是0)。
我已经尝试过"<catalog_product_load_before>
",但在这种情况下,我无法获得产品Id和SKU。
Thanks for help
如果您想从后端保存产品后$productobj
,那么您可以轻松使用catalog_product_save_after
事件。
我假设您已经知道如何在M2
中创建模块。
现在你需要为M2开发新的模块
然后在下面的路径
创建events.xml
文件 appcodeYOUR_NAMESPACEYOURMODULEetcadminhtml
<?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_NAMESPACEYOUR_MODULENAMEObserverProductsaveafter" />
</event>
</config>
和创建你的观察者文件Productsaveafter.php
在下面的路径
应用程序代码 YOUR_NAMESPACE YOURMODULE 观察者
<?php
namespace YOURNAMESPACEYOURMODULENAMEObserver;
use MagentoFrameworkEventObserverInterface;
class Productsaveafter implements ObserverInterface
{
public function execute(MagentoFrameworkEventObserver $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();
}
}
$product->getStockItem()
->setData('qty', $qty)
->save();
产品库存通过CatalogInventory模块处理。
Try this:
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。只是想在你的系统中节省一点内存;)
Try
$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();
参见Magento: Increase "Qty"取消已发货订单
使用事件catalog_product_load_before,并在观察者中使用以下代码:
$productId = $observer->getValue();
$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
$stockItem->setData('qty',555);
$stockItem->save();
您可以使用:
加载产品$productId = $observer->getProduct()->getId();
$stockItem =Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
$stockItem->setData('qty', (integer)$stockAmount);
$stockItem->save();
就这样了:)