2011-09-29 15 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 } का उपयोग कर लिया गया था कि।
यदि कथन का पालन करने वाले सभी कोड को सृजन या अद्यतन के लिए साझा किया गया है और उत्पाद ऑब्जेक्ट पर सेटटर कॉल शामिल हैं।

$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() से आती है; 'लेकिन मुझे नहीं पता क्यों। जब मैं उत्पाद लॉग करता हूं तो मुझे लगता है कि यह सही ढंग से लोड हो गया है। मैंने सोचा था कि 'सेव()' विधि के लिए एक सरल कॉल अद्यतन –

उत्तर

21

संभावनाएं हैं, आपके "सेटर कॉल" में आप कुछ ऐसा सेट करने की कोशिश कर रहे हैं जिसे सीधे $ उत्पाद पर सेट नहीं किया जा सकता है। यह "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

क्या आपको कोई विचार है कि ये चेतावनियां कहां से आती हैं? अद्यतन ठीक है, लेकिन संदेश अभी भी लॉग फ़ाइल में आते हैं .... –

+3

मैंने अंत में निर्माण/अद्यतन प्रक्रिया ('Mage :: ऐप() -> setCurrentStore (Mage :: getModel ('core/store') -> लोड (Mage_Core_Model_App) बनाने से पहले स्टोर आईडी सेट करके लॉग से गायब होने की चेतावनी दी :: ADMIN_STORE_ID)); ') ... –

18

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); जोड़ा जा रहा है। नीचे नमूना कोड उत्पाद की लागत अद्यतन करता है।

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

Magento एपीआई के साथ आसान, भी तरीकों का उपयोग कर सकते हैं ....

उदाहरण

$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

कृपया अपना उत्तर सही करें, और बताएं कि आपके द्वारा प्रदान किया गया कोड कैसे काम करता है। यह ओपी को बेहतर समझने में मदद करेगा। – Ferrrmolina