2011-09-29 30 views
12

Tôi đang làm việc trên tập lệnh sẽ tạo hoặc cập nhật các sản phẩm trong danh mục của tôi.
Các kịch bản hoạt động tốt khi sản phẩm cần phải được tạo ra, nhưng nó không thành công khi sản phẩm đã tồn tại trong cơ sở dữ liệu đem lại cho tôi (nhiều lần) thông báo sau:Cập nhật sản phẩm theo chương trình trong Magento

2011-09-30T08:00:53+00:00 ERR (3): Recoverable Error: Argument 3 passed to Mage_Catalog_Model_Resource_Eav_Mysql4_Abstract::_canUpdateAttribute() must be an array, null given, called in ...
2011-09-30T08:00:53+00:00 ERR (3): Recoverable Error: Argument 3 passed to Mage_Eav_Model_Entity_Abstract::_canUpdateAttribute() must be an array, null given, called in ...
2011-09-30T08:00:53+00:00 ERR (3): Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in ...

Tôi đã nhìn vào phương pháp được trích dẫn trong tin nhắn, nhưng tôi không thể tìm thấy bất kỳ lý do nào khiến kịch bản thất bại.
Kịch bản đầu tiên cố gắng tải một sản phẩm sử dụng:

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku);

và sau đó kiểm tra nếu sản phẩm được lấy ra bằng cách sử dụng đơn giản if(!$product) { //creation }.
Tất cả mã theo sau câu lệnh if được chia sẻ để tạo hoặc cập nhật và bao gồm các cuộc gọi setter trên đối tượng sản phẩm.

Đây là mã tôi sử dụng:

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $sku); 
if(!$product) { 
    // the product doesn't exist yet 
    $product = new Mage_Catalog_Model_Product(); 
    $product->setSku($sku); 
    $product->setTypeId(Mage_Catalog_Model_Product_Type::TYPE_SIMPLE); 
    $product->setCreatedAt(strtotime('now')); 
} 
// setters calls 
$product->setTeinte(trim((string)$record->web_teinte)); 
// ... 
// finally save the product 
$product->save(); 

Có lẽ ai đó đã phải đối mặt với cùng một vấn đề.
Mọi trợ giúp đều được chào đón! Cảm ơn bạn.

+0

Có lẽ chúng tôi có thể giúp bạn nếu bạn đăng phần có liên quan của tập lệnh. Đặc biệt là bao gồm cả dòng gây ra lỗi, bởi vì tại thời điểm này chỉ có bạn biết những gì hướng dẫn gây ra lỗi. –

+0

đúng, tôi sẽ chỉnh sửa câu hỏi. cảm ơn bạn. –

+0

Tôi biết lỗi đi kèm với '$ product-> save();' nhưng tôi không biết tại sao. Khi tôi đăng nhập sản phẩm tôi thấy nó được tải đúng. Tôi nghĩ rằng một cuộc gọi đơn giản đến phương thức 'save()' sẽ thực hiện cập nhật –

Trả lời

21

Rất có thể, trong "cuộc gọi setter" của bạn, bạn đang cố đặt thứ gì đó không thể đặt trực tiếp trên sản phẩm $. Nó thậm chí có thể là "setTeinte" vì tôi không chắc những gì đang cố gắng thiết lập. Nhưng vì chúng tôi không thể nhìn thấy tất cả mã của bạn, nên có một chút khó khăn để nói, vì vậy khi tôi hướng dẫn, hãy xem mã bên dưới, trong đó đặt một số thông tin trực tiếp trên sản phẩm và sau đó là mức cổ phiếu. Do đó, minh họa cách thiết lập một số dữ liệu nhất định. Tôi hy vọng nó sẽ giúp.

$SKU = (string)$XMLproduct->Sku; 
$product = Mage::getModel('catalog/product')->loadByAttribute('sku',$SKU); 

if ($product) { 
    //Product found, so we need to update it in Magento. 

    $product->setName((string)$XMLproduct->Name); 
    $product->setPrice((real)$XMLproduct->SalePrice); 
    //$product->setDescription((string)$XMLproduct->LongDescription); 
    //$product->setShortDescription((string)$XMLproduct->Description); 

    $product->save(); 

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

    $stockItem->setData('manage_stock', 1); 
    $stockItem->setData('qty', (integer)$XMLproduct->QtyInStock); 

    $stockItem->save(); 

    echo $SKU," Updated: Name: '",(string)$XMLproduct->Name,"', Price: ",(real)$XMLproduct->SalePrice,", Stock level: ",$XMLproduct->QtyInStock,PHP_EOL; 

    $updated++; 
} 
+0

cảm ơn bạn đã trả lời. 'setTeinte' là một cuộc gọi để thiết lập một giá trị chuỗi cho một thuộc tính mà tôi đã tạo trong bảng quản trị (và có nhiều cuộc gọi khác như thế). Đọc mã của bạn thực sự đã giúp tôi tìm ra giải pháp. Tôi đã thiết lập tất cả những giá trị như chuỗi .. vì vậy tôi quản lý để gõ diễn viên khi cần thiết và cập nhật là ok. cảm ơn bạn. –

+0

bạn có biết cảnh báo này đến từ đâu không? bản cập nhật là ok, nhưng các tin nhắn vẫn đến trong tệp nhật ký .... –

+3

Cuối cùng tôi đã thực hiện cảnh báo desappearing từ nhật ký bằng cách thiết lập id cửa hàng trước khi thực hiện quá trình tạo/cập nhật ('Mage :: app() -> setCurrentStore (Mage :: getModel ('core/store') -> load (Mage_Core_Model_App) :: ADMIN_STORE_ID)); ') ... –

18

Thêm Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); trước khi lưu sản phẩm giải quyết lỗi. Mã mẫu bên dưới cập nhật chi phí của sản phẩm.

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 
$productId = 160; 
$newCost = 80; 
$product = Mage::getModel('catalog/product')->load($productId); 
$product->setCost($newCost)->save(); 
+1

Cảm ơn câu trả lời của bạn.đã giúp tôi giải quyết vấn đề. –

0

dễ dàng với Magento API, cũng có thể sử dụng phương pháp ....

dụ

$data = array('qty'=>1, 'is_in_stock'=>1) 

$stockModel = new Mage_CatalogInventory_Model_Stock_Item_Api; 
$stockModel->update($product_id, $data); 

Cũng có thể thiết lập chế độ Quản trị

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 
0
//here what i use in codeigniter 
function updateProducts(){ 
    $params = array('name' => 'adminhtml'); // frontend or adminhtml 
    $this->load->library('magento', $params); 
    error_reporting(E_ALL | E_STRICT); 
    //$mageFilename = 'app/Mage.php'; 
    //require_once $mageFilename; 
    Mage::setIsDeveloperMode(true); 
    umask(0); 
    Mage::app(); 
    Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));  
    $obj = new stdClass(); 
    $obj->Sku = '25484684'; 
    $obj->Name = 'test product 2'; 
    $obj->SalePrice = 55; 
    $obj->LongDescription = 'test product long decription.test product long decription.test product long decription.'; 
    $obj->Description = 'short descrption'; 
    $res = $this->updateMagentoProduct($obj); 
    //dumb($res); 
} 
function updateMagentoProduct($XMLproduct){ 
    $SKU = (string)$XMLproduct->Sku; 
    $product = Mage::getModel('catalog/product')->loadByAttribute('sku',$SKU); 
    if (!$product) {//insert new product 
     $product = Mage::getModel('catalog/product'); 
     $product->setSku($SKU); 
    }  
    //$product = new Mage_Catalog_Model_Product(); 
    // Build the product 
    $product->setAttributeSetId(4); // 4 means Default AttributeSet 
    $product->setTypeId('simple'); 
    $product->setName((string)$XMLproduct->Name); 
    $product->setCategoryIds(array(2,3,4,5,6,7)); 
    $product->setWebsiteIDs(array(1)); # Website id, 1 is default 
     //$product->setWebsiteIds(array(Mage::app()->getStore(true)->getWebsite()->getId())); 
    //$product->setWebsiteIDs(array(1)); # Website id, my is 1 (default frontend) 
    $product->setDescription((string)$XMLproduct->LongDescription); 
    $product->setShortDescription((string)$XMLproduct->Description); 
    $product->setPrice((real)$XMLproduct->SalePrice); 
    # Custom created and assigned attributes 
    //$product->setHeight('my_custom_attribute1_val'); 
    //$product->setWidth('my_custom_attribute2_val'); 
    //$product->setDepth('my_custom_attribute3_val'); 
    //$product->setType('my_custom_attribute4_val'); 
    //Default Magento attribute 
    $product->setWeight(1.0); 
     $product->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH); 
    $product->setStatus(1); 
    $product->setTaxClassId(0); # My default tax class 
    /*$product->setStockData(array(
     'is_in_stock' => 1, 
     'qty' => 99999 
    ));*/ 
    $product->setCreatedAt(strtotime('now')); 
    try { 

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

     $stockItem->setData('manage_stock', 1); 
     $stockItem->setData('qty', 99999);//(integer)$XMLproduct->QtyInStock 

     $stockItem->save(); 



     echo '<h5>'.$SKU," Updated: Name: '",(string)$XMLproduct->Name,"', Price: ",(real)$XMLproduct->SalePrice,", Stock level: ",PHP_EOL.'</h5>'; 
    } 
    catch (Exception $ex) { 
     //Handle the error 
     echo '<h5>'.$ex->getMessage().'</h5>'; 
    } 
    // assign product to the default website   
    return $product->save(); 
} 
0
<?php 
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 
$product = Mage::getModel('catalog/product'); 

$product 
// ->setStoreId(1) //you can set data in store scope 
    ->setWebsiteIds(array(1)) //website ID the product is assigned to, as an array 
    ->setAttributeSetId(9) //ID of a attribute set named 'default' 
    ->setTypeId('simple') //product type 
    ->setCreatedAt(strtotime('now')) //product creation time 
// ->setUpdatedAt(strtotime('now')) //product update time 

    ->setSku('testsku61') //SKU 
    ->setName('test product21') //product name 
    ->setWeight(4.0000) 
    ->setStatus(1) //product status (1 - enabled, 2 - disabled) 
    ->setTaxClassId(4) //tax class (0 - none, 1 - default, 2 - taxable, 4 - shipping) 
    ->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) //catalog and search visibility 
    ->setManufacturer(28) //manufacturer id 
    ->setColor(24) 
    ->setNewsFromDate('06/26/2014') //product set as new from 
    ->setNewsToDate('06/30/2014') //product set as new to 
    ->setCountryOfManufacture('AF') //country of manufacture (2-letter country code) 

    ->setPrice(11.22) //price in form 11.22 
    ->setCost(22.33) //price in form 11.22 
    ->setSpecialPrice(00.44) //special price in form 11.22 
    ->setSpecialFromDate('06/1/2014') //special price from (MM-DD-YYYY) 
    ->setSpecialToDate('06/30/2014') //special price to (MM-DD-YYYY) 
    ->setMsrpEnabled(1) //enable MAP 
    ->setMsrpDisplayActualPriceType(1) //display actual price (1 - on gesture, 2 - in cart, 3 - before order confirmation, 4 - use config) 
    ->setMsrp(99.99) //Manufacturer's Suggested Retail Price 

    ->setMetaTitle('test meta title 2') 
    ->setMetaKeyword('test meta keyword 2') 
    ->setMetaDescription('test meta description 2') 

    ->setDescription('This is a long description') 
    ->setShortDescription('This is a short description') 

    ->setMediaGallery (array('images'=>array(), 'values'=>array())) //media gallery initialization 
    ->addImageToMediaGallery('media/catalog/product/1/0/10243-1.png', array('image','thumbnail','small_image'), false, false) //assigning image, thumb and small image to media gallery 

    ->setStockData(array(
         'use_config_manage_stock' => 0, //'Use config settings' checkbox 
         'manage_stock'=>1, //manage stock 
         'min_sale_qty'=>1, //Minimum Qty Allowed in Shopping Cart 
         'max_sale_qty'=>2, //Maximum Qty Allowed in Shopping Cart 
         'is_in_stock' => 1, //Stock Availability 
         'qty' => 999 //qty 
        ) 
    ) 

    ->setCategoryIds(array(3, 10)); //assign product to categories 
$product->save(); 
+0

Hãy biện minh cho câu trả lời của bạn và giải thích cách mã bạn cung cấp hoạt động. Điều này sẽ giúp OP hiểu rõ hơn. – Ferrrmolina

Các vấn đề liên quan