2011-07-18 4 views
10

J'essaie d'ajouter des produits à Magento 1.5 par programmation. Mon script sera finalement un travail de cron, mettant régulièrement à jour et ajoutant des produits comme dicté par un fichier XML fourni par le système de comptes.Magento: Ajout de nouveaux produits par programme

J'ai un problème lors de la création de nouveaux produits. Le segment de code correspondant de mon script est:

$attributeSetId = 4; 

    //$newproduct = Mage::getModel('catalog/product'); 
    $newproduct = new Mage_Catalog_Model_Product(); 

    $newproduct->setTypeId('simple'); 
    $newproduct->setWeight($product->UnitWeight);  
    $newproduct->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH); 
    $newproduct->setStatus(1); 
    $newproduct->setSKU($SKU); 
    $newproduct->setTaxClassId(0); 
    $newproduct->setWebsiteIDs(array(0)); 
    $newproduct->setStoreIDs(array(1)); 
    $newproduct->setStockData(array( 
     'is_in_stock' => 1, 
     'qty' => $XMLproduct->QtyInStock, 
     'manage_stock' => 1 
    )); 

    $newproduct->setAttributeSetId(4); 
    $newproduct->setName($product->Name); 
    $newproduct->setCategoryIds(array(3)); // array of categories it will relate to 

    $newproduct->setDescription($product->LongDescription); 
    $newproduct->setShortDescription($product->Description); 
    $newproduct->setPrice($XMLproduct->SalePrice); 

    try { 
     if (is_array($errors = $newproduct->validate())) { 
      $strErrors = array(); 
      foreach($errors as $code=>$error) { 
       $strErrors[] = ($error === true)? Mage::helper('catalog')->__('Attribute "%s" is invalid.', $code) : $error; 
      } 
      $this->_fault('data_invalid', implode("\n", $strErrors)); 
     } 

     $newproduct->save(); 
    } catch (Mage_Core_Exception $e) { 
     $this->_fault('data_invalid', $e->getMessage()); 
    } 

Le produit est « moitié » créé, mais le script abandonne lancer l'erreur suivante:

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`LittleDickyBird`.`catalog_category_product_index`, CONSTRAINT `FK_CATALOG_CATEGORY_PROD_IDX_CATEGORY_ENTITY` FOREIGN KEY (`category_id`) REFERENCES `catalog_category_entity` (`entity_id`) ON)' in /home/default/littledickybird.co.uk/user/htdocs/1.5/lib/Zend/Db/Statement/Pdo.php:228 
Stack trace: 
#0 /home/default/littledickybird.co.uk/user/htdocs/1.5/lib/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array) 
#1 /home/default/littledickybird.co.uk/user/htdocs/1.5/lib/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array) 
#2 /home/default/littledickybird.co.uk/user/htdocs/1.5/lib/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array) 
#3 /home/default/littledickybird.co.uk/user/htdocs/1.5/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ca...', Array) 
#4 /home/default/littledic in /home/default/littledickybird.co.uk/user/htdocs/1.5/lib/Zend/Db/Statement/Pdo.php on line 234 

Quelqu'un peut-il, s'il vous plaît, jeter toute la lumière sur ce qui me manque ou mal fait. Comme vous pouvez le dire sur mon ton, je suis vraiment désespéré, donc toute aide sera très appréciée.

Merci

+0

eu un problème similaire qui a été résolu en activant InnoDB et MySQL. Peut vouloir vérifier là. J'espère que cela pourra aider! – Nic

+0

Malheureusement, cela ne semble pas être le problème, car InnoDB est déjà actif. Mais merci pour votre aide. – AMP

+1

L'erreur suggère que vous essayez d'utiliser un ID de catégorie qui n'existe pas. Etes-vous sûr qu'il y a une catégorie 3? – clockworkgeek

Répondre

21

AMP, l'OP, déjà auto-répondu à la question.

Quote:

Cool, I have found the problem, the line: $newproduct->setWebsiteIDs(array(0)); should be: $newproduct->setWebsiteIDs(array(1)); Amazing how the smallest thing can waste hours!

Note: Il est tout à fait OK to self-answer votre propre question. S'il vous plaît juste le poster comme une vraie réponse, mais pas dans une question ou un commentaire. L'affichage en tant que vraie réponse permet de garder plus claire la liste des «sans réponse» (évite que les autres perdent leur temps).

1

Les réponses @Jurgen et @Amp sont parfaites.

Je pense que cela pourrait se faire comme cette façon il devient plus dynamique

$newproduct->setWebsiteIds(array(Mage::app()->getStore(true)->getWebsite()->getId())); 
Questions connexes