Pergunta

Estou criando produtos programaticamente no Magento CE 1.8.1.O formulário funciona bem, exceto que de vez em quando recebemos um erro desagradável que aparece e desaparece e não afeta todos os usuários.

:"SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '970-1' 
for key 'UNQ_CATALOGINVENTORY_STOCK_ITEM_PRODUCT_ID_STOCK_ID'"

Como eu disse, nem sempre aparece.Encontrei muitas dúvidas sobre esse problema e vi tantas sugestões para usar

$product->getResource()->save($product);
// instead of 
// $product->save();

Tentei isso e acho que o erro parou de aparecer, mas surge um novo problema;o estoque não foi salvo corretamente.O código que eu estava usando era:

// this works with $newProduct->save()
// but it doesn't work with $product->getResource()->save($newProduct)

$newProduct->setStockData(array(
              'qty'=>$params["qty"],
              'is_in_stock'=>1, 'notify_stock_qty'=>$params["stockqty"]));

Eu então tentei usar isso:

$newProduct = Mage::getModel('catalog/product')->load($product_id);
$stockItem = Mage::getModel('cataloginventory/stock_item');
$stockItem->assignProduct($newProduct);
$stockItem->setData('manage_stock', 1);
$stockItem->setData('is_in_stock', 1);
$stockItem->setData('use_config_notify_stock_qty', 0);
$stockItem->setData('qty', 40);
$newProduct->setStockItem($stockItem);
//save product..

Mas nada.O estoque é sempre 0 e manage_stock está sempre definido para No.Então tentei carregar e salvar o item de estoque depois salvando o produto, mas recebi um novo erro: "SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`bitnami_magento`.`cataloginventory_stock_item`, CONSTRAINT `FK_CATINV_STOCK_ITEM_PRD_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`product_id`) REFERENCES `catalog_product_entity` (`entity_id`) ON D)" o que parece que o produto ainda não foi criado!Eu verifiquei o back-end e o produto era criado, mas sem estoque. Parece que o método de economia de recursos ignora o stockData e também o stockItem.

Estou ficando sem ideias aqui.Eu li um monte de perguntas aqui onde elas funcionaram, mas não estão funcionando para mim.Alguém já se deparou com isso antes?

Foi útil?

Solução

No seu exemplo onde você carrega o Mage_CatalogInventory_Model_Stock_Item instância, você deve salvar a própria instância em vez do produto.

Salvar o produto não funciona porque ignora o item de estoque atribuído.Você pode ver por que isso ocorre observando o método

Mage_CatalogInventory_Model_Observer::saveInventoryData

Este método é acionado pelo catalog_product_save_after evento, que é chamado depois que um produto é salvo.O método primeiro verifica se stock_data está definido;se não estiver definido, o item de estoque não será atualizado.

Outras dicas

Este é um exemplo prático que eu uso:

$product = Mage::getModel('catalog/product');
                $product->setWebsiteIds(array(1));
                $product->setTypeId('simple');
                $product->setName('name');
                $product->setDescription('xyz');
                $product->setShortDescription(' ');
                $product->setStatus(1);
                $product->setTaxClassId(1);
                $product->setWeight(0);
                $product->setCreatedAt(strtotime('now'));
                $product->setManufacturer(1);
                $product->setAttributeSetId(1);
                $product->setSku('sku');
                $product->setPrice(5);
                $product->setVisibility(1);
                $product->save();

Após salvar o produto crie item de estoque:

$stockItem = Mage::getModel('cataloginventory/stock_item');
            $stockItem->assignProduct($product);
            $stockItem->setData('is_in_stock', 1);
            $stockItem->setData('stock_id', 1);
            $stockItem->setData('store_id', 1);
            $stockItem->setData('manage_stock', 1);
            $stockItem->setData('use_config_manage_stock', 0);
            $stockItem->setData('min_sale_qty', 1);
            $stockItem->setData('use_config_min_sale_qty', 0);
            $stockItem->setData('max_sale_qty', 1000);
            $stockItem->setData('use_config_max_sale_qty', 0);
            $stockItem->setData('qty', 10);
            $stockItem->save();

Antes de salvar os novos dados de estoque, tente carregar o item de estoque do produto e excluí-lo.

$stockItem = Mage::getModel('cataloginventory/stock_item')
    ->loadByProduct($product)
    ->delete();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top