Cómo configurar un producto para que esté dentro / fuera de stock mediante programación

8

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?

Miguel
fuente
Sin embargo, su código está funcionando para mí, debe tener la configuración para permitir que el stock se administre a través del back-end.
philwinkle

Respuestas:

12

Intenta esto en su lugar:

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

y luego establezca y guarde sus cambios como antes.

mpaepper
fuente
Gracias por eso, resolví el problema cambiando manualmente a "administrar stock" = sí en el panel de administración. Una vez hecho esto, su código funciona perfectamente.
Mike
esto funcionó para magento 1.6
ahnbizcad
Cuando hago esto en una función de observador, se muestra el siguiente mensaje de error La cantidad solicitada para "Nombre del producto" no está disponible. ¿hay algún método $ stockItem = Mage :: getModel ('cataloginventory / stock_item') -> loadByProduct ($ postProductId); $ stockItem-> setData ('qty', $ currentStock); $ stockItem-> save ();
Naveenbos
8

Intenta lo siguiente. no deberías tener que cargar un nuevo objeto de stock

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

Y simplemente guarde el producto como lo hizo en su script

Sander Mangel
fuente
No funciona bajo 1.8 CE ...
Dor
2
OP publicó la pregunta para ce1.6. Pero lo que exactamente no está funcionando. ¿Lanza un error?
Sander Mangel
Funciona bajo 1.9 CE.
user487772
3

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 ();
Raj
fuente
1
$product->save();- ¿Se requiere después de guardar $stockItem?
Styx
1
Probablemente no solo para artículos en existencia a menos que esté cambiando otros atributos del producto.
Raj
Sí, porque si lo crea desde cero, debe agregar el stockItem al producto, un observador lo recogerá y lo guardará más tarde (por lo que no se necesita guardar duplicados
Max S
3

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

$stockItem->setTypeId( $product->getTypeId() );
jaro
fuente
Mate, me llevó mucho tiempo encontrar la solución correcta para mi problema. Tu comentario me salvó la vida. ¡Salud! ;-)
medina
¡También me salvó la vida!
Bloqueo
3

Como la adición a todas las respuestas, puede ser una buena idea usar en addDatalugar de setDataestar seguro para actualizar la información y no solo configurarla.

usuario487772
fuente
2

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 ();
usuario3338098
fuente
1

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;!

colmde
fuente
1

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 llamada setProductpara tener un código de trabajo tanto para los artículos nuevos como para los existentes.

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

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.

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

Este es mi código 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 es importante

Esta es la salida

ingrese la descripción de la imagen aquí

phanvugiap
fuente