2012-06-21 39 views
5

Tôi đang cố gắng cập nhật số lượng cổ phiếu của sản phẩm trong Magento từ bên trong một tập lệnh.Không thể cập nhật Số lượng Cổ Phiếu cho một Sản phẩm trong Magento 1.6.2

Tôi tải sản phẩm, đặt số lượng cổ phiếu và lưu - nhưng số lượng vẫn không thay đổi.

// get stock data 
$stockData = $product->getStockItem(); 
printf(PHP_EOL.'Stock: qty=%d, instock=%s, man_stock=%s, use_cfg_man_stock=%s'.PHP_EOL, 
    $stockData->getData('qty'), 
    $stockData->getData('is_in_stock'), 
    $stockData->getData('manage_stock'), 
    $stockData->getData('use_config_manage_stock') 
); 
// prints out qty=0, instock=, man_stock=, use_cfg_man_stock= 


// $stockQty = 1 
$product->stockItem->setData('qty', $stockQty); 
$product->stockItem->setData('is_in_stock', $stockQty>0 ? 1 : 0); 
$product->stockItem->setData('manage_stock', 1); 
$product->stockItem->setData('use_config_manage_stock', 0); 

$product->save();       
$product->load();       
$stockData = $product->getStockItem(); 
printf('New Stock: qty=%d, instock=%s, man_stock=%s, use_cfg_man_stock=%s'.PHP_EOL, 
    $stockData->getData('qty'), 
    $stockData->getData('is_in_stock'), 
    $stockData->getData('manage_stock'), 
    $stockData->getData('use_config_manage_stock') 
); 
// prints out qty=0, instock=, man_stock=, use_cfg_man_stock= 

Tôi sẽ làm gì sai?

+0

Tôi thực sự có một "Vi phạm ràng buộc toàn vẹn" khi cố gắng lưu mục hoặc sản phẩm chứng khoán, nhưng giải pháp @nachito đã giải quyết nó cho tôi. – Willster

Trả lời

16

Tất cả những gì bạn bị thiếu là lưu $stockItem. Bạn không cần phải tạo mới stock_item cũng như bạn không phải lưu sản phẩm.

if (!($stockItem = $product->getStockItem())) { 
    $stockItem = Mage::getModel('cataloginventory/stock_item'); 
    $stockItem->assignProduct($product) 
       ->setData('stock_id', 1) 
       ->setData('store_id', 1); 
} 
$stockItem->setData('qty', $stockQty) 
      ->setData('is_in_stock', $stockQty > 0 ? 1 : 0) 
      ->setData('manage_stock', 1) 
      ->setData('use_config_manage_stock', 0) 
      ->save(); 
+0

hoạt động trong Magento ver. 1.7.0.2 – user457015

+0

Bạn có cần 'setData ('stock_id', 1)' hai lần không? – PiTheNumber

+0

Thứ hai 'setData()' là * store_id * – nachito

2

Tôi đã giải quyết nó bản thân mình:

// get stock data 
$stockData = $product->getStockItem(); 
printf(PHP_EOL.'Stock: qty=%d, instock=%s, man_stock=%s, use_cfg_man_stock=%s'.PHP_EOL, 
    $stockData->getData('qty'), 
    $stockData->getData('is_in_stock'), 
    $stockData->getData('manage_stock'), 
    $stockData->getData('use_config_manage_stock') 
); 
// prints out qty=0, instock=, man_stock=, use_cfg_man_stock= 


// $stockQty = 1 
$stockItem = Mage::getModel('cataloginventory/stock_item'); 
$stockItem->assignProduct($product); 
$stockItem->setData('is_in_stock', 1); 
$stockItem->setData('stock_id', 1); 
$stockItem->setData('store_id', 1); 
$stockItem->setData('manage_stock', 0); 
$stockItem->setData('use_config_manage_stock', 0); 
$stockItem->setData('min_sale_qty', 0); 
$stockItem->setData('use_config_min_sale_qty', 0); 
$stockItem->setData('max_sale_qty', 1000); 
$stockItem->setData('use_config_max_sale_qty', 0); 
$stockItem->setData('qty', $stockQty); 
$stockItem->save(); 

$product->save();       
$product->load();       
$stockData = $product->getStockItem(); 
printf('New Stock: qty=%d, instock=%s, man_stock=%s, use_cfg_man_stock=%s'.PHP_EOL, 
    $stockData->getData('qty'), 
    $stockData->getData('is_in_stock'), 
    $stockData->getData('manage_stock'), 
    $stockData->getData('use_config_manage_stock') 
); 
// prints out qty=1, instock=1, man_stock=0, use_cfg_man_stock=0 

Bằng cách tạo một StockItem mới, và gán đến sản phẩm. Hy vọng điều này sẽ giúp người khác.

2

Để hiển thị số lượng cổ phiếu cho sản phẩm -

<?php echo $stock = Mage::getModel('cataloginventory/stock_item')->loadByProduct($_product); ?> 

Và nếu bạn muốn hiển thị dữ liệu cá nhân sử dụng này -

<?php echo $stock->getQty(); ?> // Will display stock quantity 
<?php echo $stock->getMinQty(); ?> // Will display minimum quantity 
<?php echo $stock->getMinSaleQty(); ?> //will display minimum salable quantity 
+1

đoạn trích đẹp 'Mage :: getModel ('cataloginventory/stock_item') -> loadByProduct ($ _ product);' Tôi đã sử dụng '$ prodotto-> getStockItem()' nhưng khi '$ prodotto' được tải bởi' loadByAttribute() 'nó là một' Varien_Object' và không phải 'Mage_CatalogInventory_Model_Stock_Item' –

0

Trong trường hợp của tôi, tôi đã cùng một vấn đề với các sản phẩm mà tôi đã nhập theo chương trình. Tôi chỉ nhận ra rằng tôi đã quên để thêm stock_data trong mảng ...

'name' => $productName, 
'stock_data' => array(
         'use_config_manage_stock' => 0, 
         'manage_stock' => 0, 
         'qty' => 0, 
         'stock_id' => 1, 
         'min_qty' => 0, 
        ) 

Không có thông tin cổ phiếu dữ liệu, Magento tạo ra một ngoại lệ (tại \ Mage_CatalogInventory_Model_Stock_Item) khi thêm sản phẩm vào giỏ hàng.

Với nút này, nút này hoạt động. =)

Các vấn đề liên quan