1

我正在尝试在自定义模块中实现一个简单的观察者,以在加载产品库存时更新它。

这是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();
    } 
}

问题是 Stock 没有保存;有什么办法可以解决这个问题?

感谢帮助。

编辑:

我认为问题来自:

<catalog_product_load_before>

该产品尚未加载,我得到一个 404 Not found 页面,但是当我将其替换为:

<catalog_product_load_after>

产品库存已正确更新,但当产品库存可用性为“缺货”且库存为 0 时;前端中的“可用性”始终为“缺货”,并且“添加到购物车按钮”被隐藏(这意味着加载的库存为 0)。

我尝试过使用“ <catalog_product_load_before>”,但在这种情况下,我无法获得产品 ID 或 SKU。

感谢帮助

4

6 回答 6

3

如果您想$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();

    }   
}
于 2019-01-12T07:45:23.080 回答
1
$product->getStockItem()
    ->setData('qty', $qty)
    ->save();
于 2012-12-20T20:40:34.547 回答
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。只是想在您的系统中节省一点内存;)

于 2012-12-20T16:21:20.237 回答
0

您可以使用以下方式加载产品:

$productId = $observer->getProduct()->getId();
$stockItem =Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
$stockItem->setData('qty', (integer)$stockAmount);
$stockItem->save();

就是这样:)

于 2012-12-20T16:19:39.317 回答
0

使用事件 catalog_product_load_before 并在观察者中使用以下代码:

$productId = $observer->getValue();
$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
$stockItem->setData('qty',555);
$stockItem->save();
于 2012-12-20T16:16:48.380 回答
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();

请参阅Magento:取消已发货订单时增加“数量”

于 2012-12-20T17:07:26.560 回答