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

問題は、在庫が保存されていないことです。これに対する解決策は何ですか?

手伝ってくれてありがとう。

編集:

問題は次のことから来ていると思います:

<catalog_product_load_before>

製品がまだロードされておらず、404 Not found ページが表示されますが、次のように置き換えると:

<catalog_product_load_after>

製品在庫は適切に更新されますが、製品在庫状況が「在庫なし」で在庫が 0 の場合。フロントエンドの「在庫状況」は常に「在庫切れ」であり、「カートに追加」ボタンは非表示になっています (これは、読み込まれた在庫が 0 であることを意味します)。

「 」を試してみまし<catalog_product_load_before>たが、この場合、製品 ID も SKU も取得できません。

手伝ってくれてありがとう

4

6 に答える 6

1
$product->getStockItem()
    ->setData('qty', $qty)
    ->save();
于 2012-12-20T20:40:34.547 に答える
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 に答える
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

以下を使用して製品をロードできます。

$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

製品の在庫は、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 に答える