2011-07-18 35 views
10

Tôi đang cố gắng thêm sản phẩm vào Magento 1.5 theo lập trình. Kịch bản của tôi cuối cùng sẽ là một công việc cron, thường xuyên cập nhật và thêm các sản phẩm như được quyết định bởi một tệp XML được cung cấp bởi hệ thống tài khoản.Magento: Thêm sản phẩm mới theo chương trình

Tôi gặp sự cố khi tạo sản phẩm mới. Mã phân khúc có liên quan từ kịch bản của tôi là:

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

Sản phẩm này là 'một nửa' tạo ra, nhưng kịch bản từ bỏ ném các lỗi sau:

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 

thể bất cứ ai, làm ơn, ném bất kỳ ánh sáng vào những gì tôi đang thiếu hoặc làm sai. Như bạn có thể nói từ giọng của tôi, tôi khá tuyệt vọng, vì vậy bất kỳ sự giúp đỡ nào cũng sẽ được đánh giá rất cao.

Cảm ơn bạn

+0

Đã có một vấn đề tương tự mà đã được giải quyết bằng cách bật InnoDB trên MySQL. Có thể muốn kiểm tra ở đó. Hy vọng rằng sẽ giúp! – Nic

+0

Thật không may, đó không phải là vấn đề, như InnoDB đã hoạt động. Nhưng cảm ơn bạn đã giúp bạn. – AMP

+1

Lỗi này cho thấy bạn đang cố sử dụng ID danh mục không tồn tại. Bạn có chắc là có danh mục 3 không? – clockworkgeek

Trả lời

21

AMP, OP, đã tự trả lời câu hỏi.

Trích:

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!

Lưu ý: Nó hoàn toàn OK to self-answer câu hỏi của riêng bạn. Vui lòng chỉ đăng câu trả lời thực sự, nhưng không phải là trong câu hỏi hoặc nhận xét. Đăng câu trả lời thực sự giúp giữ danh sách "Chưa được trả lời" rõ ràng hơn (tránh làm cho người khác lãng phí thời gian của họ).

1

Cả hai câu trả lời @Jurgen và @Amp đều hoàn hảo.

Tôi nghĩ rằng điều này có thể được thực hiện như cách này để nó trở nên năng động hơn

$newproduct->setWebsiteIds(array(Mage::app()->getStore(true)->getWebsite()->getId())); 
Các vấn đề liên quan