2011-09-29 6 views
12

私のカタログの製品を作成または更新するスクリプトを作成しています。私はこの方法を見てきた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 ...

:製品を作成する必要があるとき
スクリプトが正常に動作しますが、製品はすでに私(何度も)次のようなメッセージを与えるデータベースに存在する場合には、失敗しましたメッセージに引用されていますが、スクリプトが失敗する理由が見つかりません。
スクリプトが最初に使用して製品をロードしよう:

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

し、テスト製品は、簡単なif(!$product) { //creation }を使用して取得した場合。
ifステートメントに続くすべてのコードは、作成または更新用に共有され、製品オブジェクトに対するセッター呼び出しで構成されます。ここで

は、私が使用するコードです:

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

はたぶん誰かが既に同じ問題に直面しています。
何か援助を歓迎します!ありがとうございました。

+0

スクリプトの関連部分を投稿すると助けてくれるかもしれません。特にエラーを引き起こす行が含まれているのは、現時点でどの命令がエラーをトリガしているのかが分かっているだけなので、 –

+0

そうです、質問を編集します。ありがとうございました。 –

+0

エラーは '$ product-> save();'と一緒に来ますが、私はなぜそれがわかりません。製品をログに記録すると、正しくロードされていることがわかります。私は 'save()'メソッドへの単純な呼び出しが更新をしたと思った。 –

答えて

21

「セッターコール」では、$ productに直接設定できないものを設定しようとしている可能性があります。私はそれが何を設定しようとしているか分からないので、それは "setTeinte"でさえある可能性があります。しかし、すべてのコードを見ることができないので、言い表すのは少し難しいので、私が指導するように、製品と在庫レベルに直接的な情報を設定する以下のコードを見てください。したがって、特定のデータの設定方法を示しています。私はそれが助けて欲しい

$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

あなたの答えに感謝します。 'setTeinte'は、管理パネルで作成した属性の文字列値を設定するための呼び出しです(他にもたくさんの呼び出しがあります)。あなたのコードを読むことは、私が解決策を見つけるのに本当に役立ちました。これらの値をすべて文字列として設定していたので、必要なときに型キャストすることができました。更新は大丈夫です。ありがとうございました。 –

+0

これらの警告はどこから来たのですか?アップデートはOKですが、メッセージはまだログファイルに入っています.... –

+3

私は最終的に、作成/更新プロセス( 'Mage :: app() - > setCurrentStore(Mage :: getModel( 'core/store') - > load(Mage_Core_Model_App :: ADMIN_STORE_ID));))... –

18

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);を追加すると、製品を保存する前にエラーが解決されます。以下のサンプルコードは、製品のコストを更新します。 、 もメソッドを使用することができますMagentoのAPIで簡単

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

あなたの答えをありがとう。私は問題を解決するのを助けた。 –

0

....

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

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

はまた、管理者モードを設定することができます

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

答えを正当化し、提供したコードがどのように機能するかを説明してください。これは、OPがより良く理解するのに役立ちます。 – Ferrrmolina

関連する問題