So stellen Sie ein Produkt programmgesteuert ein / aus

8

Ich habe ein paar online gefundene Schnipsel ausprobiert, aber ohne Erfolg.

Ich versuche nur, ein Produkt so einzustellen, dass es mit Code auf Lager / nicht vorrätig ist. Dies ist soweit ich gekommen bin:

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

Es werden keine Änderungen an den Produktinformationen vorgenommen, wenn diese über das Admin-Panel angezeigt werden. Irgendwelche Ideen?

Mike
quelle
Ihr Code funktioniert für mich, Sie müssen jedoch die Einstellung haben, damit der Bestand über das Backend verwaltet werden kann.
Philwinkle

Antworten:

12

Versuchen Sie stattdessen Folgendes:

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

und dann setzen und speichern Sie Ihre Änderungen wie zuvor.

mpaepper
quelle
Vielen Dank dafür. Ich habe das Problem gelöst, indem ich im Admin-Bereich manuell auf "Lager verwalten" = Ja umgeschaltet habe. Sobald dies erledigt ist, funktioniert Ihr Code perfekt.
Mike
Dies funktionierte für Magento 1.6
Ahnbizcad
Wenn ich dies in einer Beobachterfunktion mache, wird die folgende Fehlermeldung angezeigt. Die angeforderte Menge für "Produktname" ist nicht verfügbar. Gibt es eine Methode? $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ postProductId); $ stockItem-> setData ('qty', $ currentStock); $ stockItem-> save ();
Naveenbos
8

Versuche Folgendes. Sie sollten kein neues Lagerobjekt laden müssen

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

Und speichern Sie das Produkt einfach so, wie Sie es in Ihrem Skript getan haben

Sander Mangel
quelle
Funktioniert nicht unter 1.8 CE ...
Dor
2
OP hat die Frage zu ce1.6 gestellt. Aber was genau funktioniert nicht. Wirft es einen Fehler?
Sander Mangel
Funktioniert unter 1.9 CE.
Benutzer487772
3

Ich hatte ein ähnliches Problem, aber mit dem Unterschied, dass es für ein bestimmtes Produkt kein Lagerartikelobjekt gab. In diesem Fall ist es sinnvoll, das Lagerartikelobjekt zunächst vor dem Festlegen der Menge zu erstellen (es sei denn, es gibt gleichzeitig einen Weg zu ihnen).

// Überprüfen Sie, ob ein Lagerartikelobjekt vorhanden ist
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
if (leer ($ stockItemData)) {

    // Erstes Lagerartikelobjekt anlegen
    $ 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 ();

    // Initialisiere das Objekt erneut, nachdem es gespeichert wurde, damit wir das vollständige Objekt erhalten
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
}}

// Menge einstellen
$ stockItem-> setData ('Menge', $ Menge);
$ stockItem-> save ();
$ product-> save ();
Raj
quelle
1
$product->save();- Wird es nach dem Speichern benötigt $stockItem?
Styx
1
Wahrscheinlich nicht nur für Lagerartikel, es sei denn, Sie ändern andere Produktattribute.
Raj
Ja, denn wenn Sie es von Grund auf neu erstellen, müssen Sie das stockItem zum Produkt hinzufügen. Ein Beobachter wird es abholen und später speichern (daher ist kein doppeltes Speichern erforderlich
Max S
3

Ich habe Magento 1.8.1.0 CE ausprobiert und konnte "Menge" nicht speichern, da der Wert "type_id" fehlte (für neues Element). gelöst durch

$stockItem->setTypeId( $product->getTypeId() );
jaro
quelle
Kumpel, ich habe lange gebraucht, um die richtige Lösung für mein Problem zu finden. Ihr Kommentar hat mir das Leben gerettet. Prost! ;-)
Medina
Hat mir auch das Leben gerettet !!!!
Sperre
3

Als Ergänzung zu allen Antworten kann es eine gute Idee sein, diese zu verwenden, addDataanstatt sie setDatazu verwenden, um die Informationen sicher zu aktualisieren und nicht nur festzulegen.

user487772
quelle
2

Ich möchte eine Änderung von Rajs Antwort vorschlagen, um seltsame Situationen zu unterstützen. Damit die Antwort funktioniert, musste ich die if-Anweisung auskommentieren, da programmatisch erstellte Produkte teilweise, aber unvollständige Bestandsdaten enthalten können. Nur so konnte ich es zum Laufen bringen.

// Überprüfen Sie, ob ein Lagerartikelobjekt vorhanden ist
$ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
$ stockItemData = $ stockItem-> getData ();
// if (leer ($ stockItemData)) {
    // Erstes Lagerartikelobjekt anlegen
    $ 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 ();

    // Initialisiere das Objekt erneut, nachdem es gespeichert wurde, damit wir das vollständige Objekt erhalten
    $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ());
//}

// Menge einstellen
$ stockItem-> setData ('Menge', $ Menge);
$ stockItem-> save ();
$ product-> save ();
user3338098
quelle
1

Hier ist eine mögliche Ursache, die mich ungefähr 2 Stunden Arbeit gekostet hat: Ich habe es ewig versucht und mich gefragt, warum es nicht sparen würde. Ich hatte eine exit;PHP-Anweisung nach dem ->save()und ein paar Echos, damit es nicht automatisch zum nächsten Bildschirm wechselt (um das Debuggen zu erleichtern).

Die Festschreibungen in die Datenbank müssen jedoch erst spät beim Laden der Seite erfolgen. Sie werden erst gespeichert, wenn ich die exit;!

colmde
quelle
1

Wie in anderen vorgeschlagenen Antworten kann man die Klasse Mage_CatalogInventory_Model_Stock_Itemdirekt verwenden. Man muss das Produkt jedoch über einen Aufruf korrekt referenzieren, setProductum einen Arbeitscode sowohl für neue als auch für vorhandene Lagerartikel zu erhalten.

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

Alternative Lösung

Wenn Sie jedoch $product->savetrotzdem anrufen, würde ich die Bestandsdaten einfach $product->setStockdata($array)wie folgt einstellen . Auf diese Weise erstellt Magento aus den Bestandsdaten einen korrekten Lagerartikel. Ein großer Vorteil ist, dass die Aktualisierung des Lagerartikels in derselben Transaktion wie erfolgt $product->save(). Dies ist wichtig für die Datenkonsistenz.

$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
quelle
0

Dies ist mein C # -Code

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 ist wichtig

Dies ist die Ausgabe

Geben Sie hier die Bildbeschreibung ein

Phanvugiap
quelle