【问题标题】:MAgento custom event observer to update stockMAgento 自定义事件观察器以更新库存
【发布时间】:2012-12-08 04:47:18
【问题描述】:

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

这是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)。

我已尝试使用“&lt;catalog_product_load_before&gt;”,但在这种情况下,我无法获取产品 ID 或 SKU。

感谢您的帮助

【问题讨论】:

    标签: magento magento-1.9


    【解决方案1】:

    如果您想在从后端保存产品后$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();
    
        }   
    }
    

    【讨论】:

      【解决方案2】:
      $product->getStockItem()
          ->setData('qty', $qty)
          ->save();
      

      【讨论】:

        【解决方案3】:

        产品库存通过 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】:

          试试

          $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" upon cancel a shipped order

          【讨论】:

            【解决方案5】:

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

            $productId = $observer->getValue();
            $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
            $stockItem->setData('qty',555);
            $stockItem->save();
            

            【讨论】:

            • 实际上,我认为你甚至可以传入整个 $product 而不是 $productId,应该都可以。
            • @Bizboss 我编辑了我的答案以响应您的编辑。此代码现在应该在您的观察者中正常工作。它会在产品加载之前更改库存数量,因此之后产品应该显示出想要的行为。
            • 非常感谢,我已经测试过了,但是$productId = $observer-&gt;getValue();儿子什么也没给。
            • @Bizboss 哪个 Magento 版本?我在社区 1.7 中对其进行了测试,getValue() 应该可以工作,b/c 在 Mage_Core_Model_Abstract 中定义了事件 ..._load_before,在 load 中调用的 $id 作为“值”传递给观察者
            【解决方案6】:

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

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

            就是这样:)

            【讨论】:

            • 您的代码有一些错误。在 php 中转换为整数很简单 (int)。 productId 应该是 $productId 吗?并且倒数第二行缺少右括号。我投了反对票
            • @Marty Wallace 您可以在 PHP Look php.net/manual/en/language.types.type-juggling.php 中使用整数进行类型转换,该行也没有缺少括号。唯一有效的参数是缺少的 $。为什么不直接指出或编辑呢?
            • 因为代码中存在一些错误,这就是投票被否决的原因。我尝试了代码,但失败了
            • 你使用了正确的观察者事件吗?
            猜你喜欢
            • 1970-01-01
            • 2015-03-06
            • 2014-12-12
            • 1970-01-01
            • 2015-07-06
            • 1970-01-01
            • 2021-02-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多