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?

Mike
la source
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.

mpaepper
la source
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

Sander Mangel
la source
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 ();
Raj
la source
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() );
jaro
la source
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.

user487772
la source
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 ();
user3338098
la source
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;!

colmde
la source
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()
fheyer
la source
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

phanvugiap
la source