Intenté algunos fragmentos encontrados en línea pero sin éxito.
Solo tratando de configurar un producto para que esté en stock / fuera de stock con código, esto es lo que he conseguido:
$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();
No está haciendo cambios en la información del producto cuando se ve a través del panel de administración, ¿alguna idea?
inventory
ce-1.6.2.0
Miguel
fuente
fuente

Respuestas:
Intenta esto en su lugar:
y luego establezca y guarde sus cambios como antes.
fuente
Intenta lo siguiente. no deberías tener que cargar un nuevo objeto de stock
Y simplemente guarde el producto como lo hizo en su script
fuente
Tuve un problema similar pero con la diferencia de que no había ningún objeto de stock para un producto en particular. Cuando esto sucede, es bueno crear el objeto del artículo de inventario inicialmente antes de establecer la cantidad (a menos que haya una forma de hacerlo al mismo tiempo).
// Comprueba si hay un objeto de stock $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ()); $ stockItemData = $ stockItem-> getData (); if (vacío ($ stockItemData)) { // Crea el objeto de stock 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 ('cantidad', 0); $ stockItem-> save (); // Inicia el objeto nuevamente después de haberlo guardado para que obtengamos el objeto completo $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ()); } // Establecer la cantidad $ stockItem-> setData ('cantidad', $ cantidad); $ stockItem-> save (); $ producto-> save ();fuente
$product->save();- ¿Se requiere después de guardar$stockItem?probándose magento 1.8.1.0 CE y no se pudo guardar "qty" debido a que falta el valor "type_id" (para un nuevo elemento). resuelto por
fuente
Como la adición a todas las respuestas, puede ser una buena idea usar en
addDatalugar desetDataestar seguro para actualizar la información y no solo configurarla.fuente
Quiero sugerir un cambio en la respuesta de Raj para apoyar situaciones extrañas. Para que la respuesta funcione, tuve que comentar la declaración if, porque los productos creados de manera programática pueden tener datos de existencias parciales pero incompletos. Esta fue la única forma en que pude hacerlo funcionar.
// Comprueba si hay un objeto de stock $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ()); $ stockItemData = $ stockItem-> getData (); // if (empty ($ stockItemData)) { // Crea el objeto de stock 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 ('cantidad', 0); $ stockItem-> save (); // Inicia el objeto nuevamente después de haberlo guardado para que obtengamos el objeto completo $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ product-> getId ()); //} // Establecer la cantidad $ stockItem-> setData ('cantidad', $ cantidad); $ stockItem-> save (); $ producto-> save ();fuente
Aquí hay una posible causa que me costó aproximadamente 2 horas de trabajo: estuve intentando esto durante años preguntándome por qué no ahorraría. Tenía una
exit;declaración de php después del->save()y un montón de ecos para que no se moviera a la siguiente pantalla automáticamente (para ayudar a depurar).Sin embargo, los commits a la base de datos deben ocurrir tarde en la carga de la página, ¡no me guardaría hasta que elimine el
exit;!fuente
Como en otras respuestas sugeridas, uno puede usar la clase
Mage_CatalogInventory_Model_Stock_Itemdirectamente. Pero uno tiene que hacer referencia al producto correctamente a través de una llamadasetProductpara tener un código de trabajo tanto para los artículos nuevos como para los existentes.Solución alternativa
Sin embargo, si llama de
$product->savetodos modos, solo establecería los datos de stock de la$product->setStockdata($array)siguiente manera. De esta manera, Magento crea un artículo de stock correcto a partir de los datos de stock. La gran ventaja es que la actualización del artículo de stock ocurre en la misma transacción que$product->save(). Esto es importante para la consistencia de los datos.fuente
Este es mi código C #
is_in_stockSpecifiedes importanteEsta es la salida
fuente