Come impostare un prodotto per essere disponibile / esaurito a livello di codice


8

Ho provato alcuni frammenti trovati online ma senza successo.

Sto solo cercando di impostare un prodotto per essere disponibile / esaurito con il codice, questo è quanto ho ottenuto:

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

Non sta apportando modifiche alle informazioni sul prodotto se visualizzate attraverso il pannello di amministrazione, qualche idea?


Il tuo codice funziona per me, tuttavia, devi avere l'impostazione per consentire la gestione dello stock tramite il back-end.
Philwinkle,

Risposte:


12

Prova questo invece:

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

e quindi impostare e salvare le modifiche come prima.


Grazie per questo, ho risolto il problema passando manualmente a "gestisci stock" = sì nel pannello di amministrazione. Una volta fatto, il tuo codice funziona perfettamente.
Mike

questo ha funzionato per Magento 1.6
ahnbizcad il

Quando lo faccio in una funzione di osservatore, viene visualizzato il messaggio di errore sotto La quantità richiesta per "Nome prodotto" non è disponibile. esiste un metodo $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ postProductId); $ stockItem-> setData ('qty', $ currentStock); $ stockItem-> save ();
Naveenbos,

8

Prova quanto segue. non dovresti caricare un nuovo oggetto di scorta

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

E basta salvare il prodotto come hai fatto nella tua sceneggiatura


Non funziona sotto 1.8 CE ...
Dor

2
OP ha pubblicato la domanda per ce1.6. Ma cosa non funziona esattamente. Emette un errore?
Sander Mangel

Funziona sotto 1,9 CE.
user487772

3

Ho avuto un problema simile, ma con la differenza che non c'era alcun oggetto articolo di magazzino per un particolare prodotto. Quando ciò accade, è bene creare inizialmente l'oggetto di magazzino prima di impostare la quantità (a meno che non ci sia un modo per farlo contemporaneamente).

// Verifica se esiste un oggetto articolo di magazzino
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
if (vuoto ($ stockItemData)) {

    // Crea l'oggetto iniziale di magazzino
    $ 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', $ prodotto-> getId ());
    $ StockItem-> setData ( 'qty', 0);
    $ StockItem-> save ();

    // Inizializza nuovamente l'oggetto dopo che è stato salvato in modo da ottenere l'oggetto completo
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
}

// Imposta la quantità
$ StockItem-> setData ( 'qty', $ qty);
$ StockItem-> save ();
$ Prodotto-> save ();

1
$product->save();- è richiesto dopo il salvataggio $stockItem?
Styx,

1
Probabilmente non per il solo articolo in magazzino, a meno che tu non stia modificando altri attributi del prodotto.
Raj

Sì, perché se lo crei da zero devi aggiungere lo stockItem al prodotto, un osservatore lo raccoglierà e lo salverà in seguito (quindi non è necessario un salvataggio duplicato
Max S

3

provando magento 1.8.1.0 CE e impossibile salvare "qty" a causa del valore "type_id" mancante (per il nuovo oggetto). risolto da

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

Amico, mi ci è voluto molto tempo per trovare la soluzione giusta per il mio problema. Il tuo commento mi ha salvato la vita. Saluti! ;-)
medina

Mi hai anche salvato la vita !!!!
Blocco

3

Come aggiunta a tutte le risposte, può essere una buona idea usare addDatainvece che setDatain sicurezza per aggiornare le informazioni e non solo impostarle.


2

Voglio suggerire una modifica alla risposta di Raj per supportare situazioni strane. Affinché la risposta funzionasse, ho dovuto commentare l'istruzione if, poiché i prodotti creati in modo programmatico possono avere dati di magazzino parziali, ma incompleti. Questo è stato l'unico modo in cui sono riuscito a farlo funzionare.

// Verifica se esiste un oggetto articolo di magazzino
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
// if (vuoto ($ stockItemData)) {
    // Crea l'oggetto iniziale di magazzino
    $ 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', $ prodotto-> getId ());
    $ StockItem-> setData ( 'qty', 0);
    $ StockItem-> save ();

    // Inizializza nuovamente l'oggetto dopo che è stato salvato in modo da ottenere l'oggetto completo
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
//}

// Imposta la quantità
$ StockItem-> setData ( 'qty', $ qty);
$ StockItem-> save ();
$ Prodotto-> save ();

1

Ecco una possibile causa che mi è costata circa 2 ore di lavoro: ci provavo da anni chiedendomi perché non avrebbe risparmiato. Ho avuto una exit;dichiarazione php dopo il ->save()e un mucchio di echi in modo da non passare automaticamente alla schermata successiva (per aiutare il debug).

Tuttavia, i commit nel database devono avvenire in ritardo nel caricamento della pagina e non mi salverebbero fino a quando non avrò rimosso il exit;!


1

Come in altre risposte suggerite, si può usare Mage_CatalogInventory_Model_Stock_Itemdirettamente la classe . Ma è necessario fare riferimento correttamente al prodotto tramite una chiamata setProductper avere un codice funzionante sia per gli articoli nuovi che per quelli esistenti.

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

Soluzione alternativa

Tuttavia, se chiami $product->savecomunque, imposterei i dati di borsa $product->setStockdata($array)come segue. In questo modo Magento crea un articolo di magazzino corretto dai dati di magazzino. Il grande vantaggio è che l'aggiornamento degli articoli di magazzino avviene nella stessa transazione di $product->save(). Questo è importante per la coerenza dei dati.

$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

Questo è il mio codice 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

Questo è l'output

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.