2012-12-20 40 views
1

我試圖在自定義模塊中實現一個簡單的觀察者來更新產品庫存,當它被加載。MAgento自定義事件觀察員更新股票

這是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;前端的「可用性」始終「缺貨」,並且「添加到購物車按鈕」被隱藏(這意味着已加載的庫存爲0)。

我嘗試過使用「<catalog_product_load_before>」,但在這種情況下我無法獲得產品ID和SKU。

感謝您的幫助

回答

0

使用事件catalog_product_load_before和觀察者使用下面的代碼:

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

其實我覺得你甚至可以通過在整個$產品,而不是$的productId ,都應該工作。 – mpaepper

+0

感謝您的幫助,請參閱我的編輯更新。 – Bizboss

+0

@Bizboss我編輯了我的答案,迴應你的編輯。這段代碼現在應該可以在你的觀察者中正常工作。它會在產品加載之前更改庫存數量,因此之後產品應該顯示想要的行爲。 – mpaepper

0

可以使用加載產品:

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

就是這樣:)

+0

有幾個錯誤與你的代碼。在PHP中轉換爲整數只是(int)。應該productId是$ productId?第二行最後一行缺少右括號。我downvoted –

+0

謝謝你的幫助,請參閱我的編輯問題。 – Bizboss

+0

@Marty Wallace你可以在PHP中使用整數進行類型轉換查看http://php.net/manual/en/language.types.type-juggling.php 在該行上也沒有缺失的括號。 唯一有效的參數是缺少的$。 而不是downvoting爲什麼不只是指出或編輯? – boruch

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。只是想挽回你的系統內存很少;)

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: Increase "Qty" upon cancel a shipped order

1
$product->getStockItem() 
    ->setData('qty', $qty) 
    ->save(); 
相關問題