Comment paramétrer un produit pour qu'il soit en / hors stock par programme


8

J'ai essayé quelques extraits trouvés en ligne mais sans succès.

J'essaie simplement de définir un produit pour qu'il soit en stock / en rupture de stock avec le code, c'est pour autant que je suis arrivé:

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

Il ne modifie pas les informations sur le produit lorsqu'il est affiché via le panneau d'administration, des idées?


Votre code fonctionne pour moi, cependant, vous devez avoir le paramètre pour permettre au stock d'être géré via le backend.
philwinkle

Réponses:


12

Essayez plutôt ceci:

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

puis définissez et enregistrez vos modifications comme précédemment.


Merci pour cela, j'ai résolu le problème en passant manuellement à "gérer les stocks" = oui dans le panneau d'administration. Une fois cela fait, votre code fonctionne parfaitement.
Mike

cela a fonctionné pour magento 1.6
ahnbizcad

Lorsque je fais cela dans une fonction d'observateur, le message d'erreur ci-dessous s'affiche La quantité demandée pour "Productname" n'est pas disponible. existe-t-il une méthode $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ postProductId); $ stockItem-> setData ('qty', $ currentStock); $ stockItem-> save ();
Naveenbos

8

Essayez ce qui suit. vous ne devriez pas avoir à charger un nouvel objet stock

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

Et enregistrez simplement le produit comme vous l'avez fait dans votre script


Ne fonctionne pas sous 1.8 CE ...
Dor

2
OP a posé la question pour ce1.6. Mais ce qui ne fonctionne pas exactement. Cela génère-t-il une erreur?
Sander Mangel

Fonctionne sous 1.9 CE.
user487772

3

J'ai eu un problème similaire, mais avec la différence qu'il n'y avait aucun objet de stock pour un produit particulier. Lorsque cela se produit, il est bon de créer l'objet article en stock initialement avant de définir la quantité (sauf s'il existe un moyen pour eux en même temps).

// Vérifier s'il existe un objet de stock
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
if (vide ($ stockItemData)) {

    // Créer l'objet de stock initial
    $ 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 ();

    // Initier à nouveau l'objet après qu'il a été enregistré afin que nous obtenions l'objet complet
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
}

// Définir la quantité
$ stockItem-> setData ('qty', $ qty);
$ stockItem-> save ();
$ product-> save ();

1
$product->save();- est-il obligatoire après avoir enregistré $stockItem?
Styx

1
Probablement pas uniquement pour l'article en stock, sauf si vous modifiez d'autres attributs de produit.
Raj

Oui, car si vous le créez à partir de zéro, vous devez ajouter le stockItem au produit, un observateur le ramassera et l'enregistrera plus tard (donc la sauvegarde en double n'est pas nécessaire
Max S

3

essayant sur magento 1.8.1.0 CE et n'a pas pu enregistrer "qty" en raison de la valeur "type_id" manquante (pour le nouvel élément). résolu par

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

Mate, il m'a fallu beaucoup de temps pour trouver la bonne solution à mon problème. Votre commentaire m'a sauvé la vie. À votre santé! ;-)
medina

J'ai aussi sauvé ma vie !!!!
Verrouiller le

3

En tant qu'addition à toutes les réponses, il peut être judicieux d'utiliser addDataau lieu de moins setDatapour être sûr de mettre à jour les informations et pas seulement de les configurer.


2

Je veux suggérer un changement à la réponse de Raj pour soutenir des situations étranges. Pour que la réponse fonctionne, j'ai dû commenter l'instruction if, car les produits créés de manière programmatique peuvent avoir des données de stock partielles mais incomplètes. C'était la seule façon pour moi de le faire fonctionner.

// Vérifier s'il existe un objet de stock
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
// si (vide ($ stockItemData)) {
    // Créer l'objet de stock initial
    $ 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 ();

    // Initier à nouveau l'objet après qu'il a été enregistré afin que nous obtenions l'objet complet
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
//}

// Définir la quantité
$ stockItem-> setData ('qty', $ qty);
$ stockItem-> save ();
$ product-> save ();

1

Voici une cause possible qui m'a coûté environ 2 heures de travail: j'essayais cela depuis des siècles en me demandant pourquoi cela ne sauverait pas. J'ai eu une exit;déclaration php après le ->save()et un tas d'échos afin qu'elle ne passe pas automatiquement à l'écran suivant (pour aider au débogage).

Cependant, les validations dans la base de données doivent se produire tard dans le chargement de la page, elles ne seraient pas enregistrées pour moi jusqu'à ce que j'aie supprimé le exit;!


1

Comme dans d'autres réponses suggérées, on peut utiliser Mage_CatalogInventory_Model_Stock_Itemdirectement la classe . Mais il faut référencer le produit correctement via un appel setProductpour avoir un code de travail à la fois pour les articles en stock nouveaux et existants.

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

Solution alternative

Cependant, si vous appelez de $product->savetoute façon, je définirais simplement les données de stock $product->setStockdata($array)comme suit. De cette façon, Magento crée un article de stock correct à partir des données de stock. Le gros avantage est que la mise à jour du stock se produit dans la même transaction que $product->save(). Ceci est important pour la cohérence des données.

$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

Ceci est mon code 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 est important

Ceci est la sortie

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.