2012-06-21 8 views
5

Ich versuche, die Lagermengen von Produkten in Magento innerhalb eines Skripts zu aktualisieren.Konnte Bestandsmenge für ein Produkt in Magento 1.6.2 nicht aktualisieren

Ich lade das Produkt, legen Sie die Lagermenge und speichern - aber die Menge bleibt unverändert.

// 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= 

Wohin gehe ich falsch?

+0

Ich habe tatsächlich eine 'Integrität Einschränkung Verletzung' beim Versuch, die Lager Artikel oder Produkt zu speichern, aber @nachito Lösung löste es für mich. – Willster

Antwort

16

Alles, was Sie fehlten, ist die $stockItem zu speichern. Sie sollten weder eine neue stock_item erstellen noch das Produkt speichern müssen.

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

funktioniert in Magento ver. 1.7.0.2 – user457015

+0

Müssen Sie setData ('stock_id', 1) 'zweimal eingeben? – PiTheNumber

+0

Zweite 'setData()' ist * store_id * – nachito

2

ich es selbst gelöst habe:

// 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 

durch ein neues Lager lieferbar zu schaffen, und dass das Produkt zugeordnet wird. Hoffe das hilft jemand anderem.

2

Zur Bestandsmenge für das Produkt anzuzeigen -

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

Und wenn Sie diesen einzelnen Daten verwenden, angezeigt werden sollen -

<?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

nice snippet 'Magier :: getModel ('cataloginventory/stock_item') -> loadByProduct ($ _ product);' Ich benutzte '$ prodotto-> getStockItem()' aber wenn '$ prodotto' von' loadByAttribute() geladen wird 'Es ist ein' Varien_Object' und kein 'Mage_CatalogInventory_Model_Stock_Item' –

0

In meinem Fall habe ich das gleiche Problem mit Produkten bekam das habe ich programmgesteuert importiert. Ich habe erkannt, dass ich stock_data im Array ...

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

Ohne Bestandsdaten Informationen, Magento erzeugt eine Ausnahme (bei \ Mage_CatalogInventory_Model_Stock_Item) beim Hinzufügen Produkt Warenkorb legen vergessen.

Mit diesem Knoten funktioniert es. =)