Как программно настроить наличие/отсутствие товара на складе


Я попробовал несколько фрагментов, найденных в Интернете, но безуспешно.

Просто пытаюсь настроить товар на наличие/отсутствие на складе с помощью кода, это все, что я получил:

$product = Mage::getModel('catalog/product')->load( 'id' );

$stockItem = $product->getStockItem();
$stockItem->setData('manage_stock', 1);
$stockItem->setData('is_in_stock', 0);
$stockItem->setData('use_config_notify_stock_qty', 0);
$stockItem->setData('qty', 0);

$stockItem->save();
$product->save();

Он не вносит никаких изменений в информацию о продукте при просмотре через панель администратора, есть идеи?

Author: user487772, 2013-03-19

9 answers

Попробуйте вместо этого:

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product);

А затем установите и сохраните изменения, как и раньше.

 13
Author: mpaepper, 2013-03-19 15:27:03

Попробуйте выполнить следующее. вам не нужно загружать новый стандартный объект

$product->setStockData(
   array( 
          'is_in_stock' => 0, 
          'qty' => 0,
          'manage_stock' => 1,
          'use_config_notify_stock_qty' => 1
   )
 ); 

И просто сохраните продукт, как вы сделали в своем скрипте

 8
Author: Sander Mangel, 2015-02-25 18:46:21

У меня была аналогичная проблема, но с той разницей, что для конкретного продукта не было объекта "товар". Когда это происходит, полезно сначала создать объект "товар", прежде чем задавать количество (если только для них не существует способа одновременно).

// Check if there is a stock item object
$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItemData = $stockItem->getData();
if (empty($stockItemData)) {

    // Create the initial stock item object
    $stockItem->setData('manage_stock',1);
    $stockItem->setData('is_in_stock',$qty ? 1 : 0);
    $stockItem->setData('use_config_manage_stock', 0);
    $stockItem->setData('stock_id',1);
    $stockItem->setData('product_id',$product->getId());
    $stockItem->setData('qty',0);
    $stockItem->save();

    // Init the object again after it has been saved so we get the full object
    $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
}

// Set the quantity
$stockItem->setData('qty',$qty);
$stockItem->save();
$product->save();
 3
Author: Raj, 2014-02-10 14:09:33

Примеряю magento 1.8.1.0 CE и не смог сохранить "количество" из-за отсутствия значения "type_id" (для нового элемента). решается с помощью

$stockItem->setTypeId( $product->getTypeId() );
 3
Author: jaro, 2014-03-27 11:30:00

В качестве дополнения ко всем ответам может быть хорошей идеей использовать addData вместо setData в одере, чтобы быть безопасным для обновления информации, а не только для ее настройки.

 3
Author: user487772, 2014-03-29 13:05:54

Я хочу предложить изменить ответ Раджа, чтобы поддержать странные ситуации. Для того, чтобы ответ сработал, мне пришлось прокомментировать оператор if, потому что продукты, созданные программным способом, могут иметь частичные, но неполные данные о запасах. Это был единственный способ заставить его работать.

// Check if there is a stock item object
$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItemData = $stockItem->getData();
//if (empty($stockItemData)) {
    // Create the initial stock item object
    $stockItem->setData('manage_stock',1);
    $stockItem->setData('is_in_stock',$qty ? 1 : 0);
    $stockItem->setData('use_config_manage_stock', 0);
    $stockItem->setData('stock_id',1);
    $stockItem->setData('product_id',$product->getId());
    $stockItem->setData('qty',0);
    $stockItem->save();

    // Init the object again after it has been saved so we get the full object
    $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
//}

// Set the quantity
$stockItem->setData('qty',$qty);
$stockItem->save();
$product->save();
 2
Author: user3338098, 2015-10-12 14:59:16

Вот возможная причина, которая стоила мне около 2 часов работы: я пытался сделать это целую вечность, задаваясь вопросом, почему это не спасет. У меня был оператор php exit; после ->save() и куча эхо-сигналов, чтобы он автоматически не переходил на следующий экран (для облегчения отладки).

Однако фиксация в базе данных должна происходить поздно при загрузке страницы, она не сохранится для меня, пока я не удалю exit;!

 1
Author: colmde, 2014-09-22 12:20:59

Как и в других предложенных ответах, можно напрямую использовать класс Mage_CatalogInventory_Model_Stock_Item. Но нужно правильно ссылаться на продукт с помощью вызова setProduct, чтобы иметь рабочий код как для новых, так и для существующих продуктов.

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItem->setProduct($product)
    ->setData('stock_id', Mage_CatalogInventory_Model_Stock::DEFAULT_STOCK_ID)
    ->setData('qty', 1)
    ->setData('is_in_stock', 1)
    ->setData('manage_stock', 1)
    ->setData('use_config_manage_stock', 0)
    ->setData('use_config_backorders', 0)
    ->setData('backorders', 0)
    ->setData('use_config_max_sale_qty', 0)
    ->setData('max_sale_qty', 1)                
    ->save();

Альтернативное решение

Однако, если вы все равно позвоните $product->save, я бы просто установил данные о запасах через $product->setStockdata($array) следующим образом. Таким образом, Magento создает правильный товар на основе данных о запасах. Большим преимуществом является то, что обновление номенклатуры происходит в той же транзакции, что и $product->save(). Это важно для согласованности данных.

$stockData = array();
$stockData['qty'] = 1;
$stockData['is_in_stock'] = 1;
$stockData['manage_stock'] = 1;
$stockData['use_config_manage_stock'] = 0;
$stockData['use_config_backorders'] = 0;
$stockData['backorders'] = 0;
$stockData['use_config_max_sale_qty'] = 0;
$stockData['max_sale_qty'] = 1;
$product->setStockData($stockData);
//...
$product->save()
 1
Author: fheyer, 2016-04-29 11:38:42

Это мой код на C#

var inStock = qty > 0 ? 1 : 0;    
var stock_data = new catalogInventoryStockItemUpdateEntity()
            {
                qty = qty,
                is_in_stock = inStock,
                manage_stock = 1,
                is_in_stockSpecified = true,
            };

is_in_stockSpecified важно

Это вывод

enter image description here

 0
Author: phanvugiap, 2017-07-12 21:22:21