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


8

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

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

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

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


Ваш код работает для меня, однако, вы должны иметь настройку, позволяющую управлять акциями через бэкэнд.
Philwinkle

Ответы:


12

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

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

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


Спасибо за это, я решил проблему, вручную переключившись на «управлять складом» = да в админ-панели. Как только это будет сделано, ваш код работает отлично.
Майк

это сработало для magento 1.6
ahnbizcad

Когда я делаю это в функции наблюдателя, ниже отображается сообщение об ошибке. Запрашиваемое количество для «Productname» недоступно. есть ли метод $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ postProductId); $ stockItem-> setData ('qty', $ currentStock); $ stockItem-> Save ();
Навинбос

8

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

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

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


Не работает под 1.8 CE ...
Дор

2
ОП разместил вопрос для ce1.6. Но что именно не работает. Выдает ошибку?
Сандер Мангель

Работает ли под 1.9 CE.
user487772

3

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

// Проверяем, есть ли объект на складе
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
if (empty ($ stockItemData)) {

    // Создаем исходный объект товара
    $ StockItem-> УстановитьДанные ( 'manage_stock', 1);
    $ stockItem-> setData ('is_in_stock', $ qty? 1: 0);
    $ stockItem-> setData ('use_config_manage_stock', 0);
    $ StockItem-> УстановитьДанные ( 'stock_id', 1);
    $ StockItem-> УстановитьДанные ( 'product_id', $ продукт-> GetId ());
    $ StockItem-> УстановитьДанные ( 'кол-во', 0);
    $ StockItem-> Save ();

    // Инициируем объект снова после того, как он был сохранен, чтобы мы получили полный объект
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
}

// Установить количество
$ StockItem-> УстановитьДанные ( 'кол-во', $ кол-во);
$ StockItem-> Save ();
$ Продукт-> Save ();

1
$product->save();- требуется ли после сохранения $stockItem?
Стикс

1
Вероятно, не только для товара, если вы не меняете другие атрибуты продукта.
Радж

Да, потому что если вы создаете его с нуля, вам нужно добавить stockItem к продукту, наблюдатель подберет его и сохранит позже (поэтому повторное сохранение не требуется
Макс.

3

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

$stockItem->setTypeId( $product->getTypeId() );

Дружище, мне потребовалось много времени, чтобы найти правильное решение для моей проблемы. Ваш комментарий спас мне жизнь. Ура! ;-)
Медина

Спасла мою жизнь тоже !!!!
Блокировка

3

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


2

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

// Проверяем, есть ли объект на складе
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
// if (empty ($ stockItemData)) {
    // Создаем исходный объект товара
    $ StockItem-> УстановитьДанные ( 'manage_stock', 1);
    $ stockItem-> setData ('is_in_stock', $ qty? 1: 0);
    $ stockItem-> setData ('use_config_manage_stock', 0);
    $ StockItem-> УстановитьДанные ( 'stock_id', 1);
    $ StockItem-> УстановитьДанные ( 'product_id', $ продукт-> GetId ());
    $ StockItem-> УстановитьДанные ( 'кол-во', 0);
    $ StockItem-> Save ();

    // Инициируем объект снова после того, как он был сохранен, чтобы мы получили полный объект
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
//}

// Установить количество
$ StockItem-> УстановитьДанные ( 'кол-во', $ кол-во);
$ StockItem-> Save ();
$ Продукт-> Save ();

1

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

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


1

Как и в других предложенных ответах, можно использовать класс 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()

0

Это мой код 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 является важным

Это выход

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.