Como definir um produto para entrar / sair de estoque programaticamente

8

Tentei alguns trechos encontrados online, mas sem sucesso.

Apenas tentando definir um produto para estar em estoque / fora de estoque com código, isso é o máximo que eu consegui:

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

Ele não faz alterações nas informações do produto quando visualizado no painel do administrador, tem alguma idéia?

Mike
fonte
Seu código está funcionando para mim, no entanto, você precisa ter a configuração para permitir que o estoque seja gerenciado pelo back-end.
19413 philwinkle

Respostas:

12

Tente isso:

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

e defina e salve suas alterações como antes.

mpaepper
fonte
Obrigado por isso, resolvi o problema alternando manualmente para "gerenciar estoque" = yes no painel do administrador. Feito isso, seu código funciona perfeitamente.
1955 Mike
isso funcionou para o magento 1.6
ahnbizcad 4/11/15
Quando faço isso em uma função de observador, a mensagem de erro abaixo é exibida. A quantidade solicitada para "Nome do produto" não está disponível. existe algum método $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ postProductId); $ stockItem-> setData ('qty', $ currentStock); $ stockItem-> save ();
Naveenbos
8

Tente o seguinte. você não precisa carregar um novo objeto de estoque

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

E basta salvar o produto como você fez no seu script

Sander Mangel
fonte
Não funciona sob 1.8 CE ...
Dor
2
O OP postou a pergunta para ce1.6. Mas o que exatamente não está funcionando. Isso gera um erro?
Sander Mangel
Funciona sob 1,9 CE.
user487772
3

Eu tive um problema semelhante, mas com a diferença de que não havia nenhum objeto de item de estoque para um produto específico. Quando isso acontece, é bom criar o objeto de item de estoque inicialmente antes de definir a quantidade (a menos que exista um caminho para eles ao mesmo tempo).

// Verifique se há um objeto de item de estoque
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
if (vazio ($ stockItemData)) {

    // Crie o objeto de item de estoque inicial
    $ 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 ();

    // Inicia o objeto novamente depois que ele foi salvo, para obter o objeto completo
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
}

// Defina a quantidade
$ stockItem-> setData ('qty', $ qty);
$ stockItem-> save ();
$ product-> save ();
Raj
fonte
11
$product->save();- é necessário depois de salvar $stockItem?
Styx
11
Provavelmente não apenas para itens de estoque, a menos que você esteja alterando outros atributos do produto.
Raj
Sim, porque se você o criar do zero, precisará adicionar o stockItem ao produto, um Observer o buscará e o salvará mais tarde (para que não seja necessário salvar cópias duplicadas
Max S
3

experimentando o magento 1.8.1.0 CE e não foi possível salvar "qty" devido à falta do valor "type_id" (para novo item). resolvido por

$stockItem->setTypeId( $product->getTypeId() );
jaro
fonte
Companheiro, demorei muito tempo para encontrar a solução certa para o meu problema. Seu comentário salvou minha vida. Felicidades! ;-)
medina
Salvou minha vida também !!!!
Bloqueia
3

Como complemento a todas as respostas, pode ser uma boa ideia usar, em addDatavez de mais, setDataser seguro para atualizar as informações e não apenas defini-las.

user487772
fonte
2

Quero sugerir uma alteração na resposta de Raj para apoiar situações estranhas. Para que a resposta funcionasse, tive que comentar a instrução if, porque os produtos criados de maneira programática podem ter dados de estoque parciais, mas incompletos. Esta foi a única maneira que eu consegui fazer funcionar.

// Verifique se há um objeto de item de estoque
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
// if (vazio ($ stockItemData)) {
    // Crie o objeto de item de estoque inicial
    $ 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 ();

    // Inicia o objeto novamente depois que ele foi salvo, para obter o objeto completo
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
//}

// Defina a quantidade
$ stockItem-> setData ('qty', $ qty);
$ stockItem-> save ();
$ product-> save ();
user3338098
fonte
1

Aqui está uma causa possível que me custou cerca de 2 horas de trabalho: eu estava tentando isso há séculos, me perguntando por que não salvaria. Eu tive uma exit;instrução php após o ->save()e um monte de ecos para que não passasse para a próxima tela automaticamente (para ajudar na depuração).

No entanto, as confirmações no banco de dados devem ocorrer mais tarde no carregamento da página e não serão salvas para mim até que eu remova o arquivo exit;!

colmde
fonte
1

Como em outras respostas sugeridas, pode-se usar a classe Mage_CatalogInventory_Model_Stock_Itemdiretamente. Mas é preciso fazer referência ao produto corretamente por meio de uma chamada setProductpara ter um código de trabalho para itens de estoque novos e existentes.

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

Solução alternativa

No entanto, se você ligar de $product->savequalquer maneira, eu apenas definiria os dados de ações da $product->setStockdata($array)seguinte maneira. Dessa forma, o Magento cria um item de estoque correto a partir dos dados do estoque. A grande vantagem é que a atualização do item de estoque ocorre na mesma transação que $product->save(). Isso é importante para a consistência dos dados.

$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()
fheyer
fonte
0

Este é o meu código 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 é importante

Esta é a saída

insira a descrição da imagem aqui

phanvugiap
fonte