2011-09-29 13 views
12

Sto lavorando a uno script che creerà o aggiornerà i prodotti nel mio catalogo.
Lo script funziona bene quando il prodotto deve essere creato, ma non riesce quando il prodotto è già presente nel database di darmi (molte volte) i seguenti messaggi:Aggiorna i prodotti a livello di codice in 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 ...

Sono stato a guardare il metodo citato nel messaggio, ma non riesco a trovare alcun motivo per cui lo script fallisce.
Lo script prima provare a caricare un prodotto utilizzando:

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

e quindi verificare se il prodotto è stato recuperato utilizzando un semplice if(!$product) { //creation }.
Tutto il codice che segue l'istruzione if è condiviso per la creazione o l'aggiornamento ed è costituito da chiamate setter su oggetto prodotto.

ecco il codice che uso:

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

Forse qualcuno ha già affrontato lo stesso problema.
Qualsiasi aiuto è benvenuto! Grazie.

+0

Forse possiamo aiutarti se pubblichi la parte rilevante del tuo script. Soprattutto includendo la riga che causa l'errore, perché al momento solo tu sai quale istruzione attiva l'errore. –

+0

esatto, modifico la domanda. grazie. –

+0

So che l'errore arriva con '$ product-> save();' ma non so perché. Quando registro il prodotto, vedo che è stato caricato correttamente. Ho pensato che una semplice chiamata al metodo 'save()' avrebbe reso l'aggiornamento –

risposta

21

È probabile che nelle "chiamate setter" si stia tentando di impostare qualcosa che non può essere impostato direttamente su $ product. Potrebbe anche essere il "setTeinte" perché non sono sicuro di cosa stia cercando di impostare. Ma poiché non possiamo vedere tutto il tuo codice, è un po 'difficile da dire, quindi, come guida, dai uno sguardo al codice sottostante, che imposta alcune informazioni direttamente sul prodotto e sui livelli di stock. Pertanto, illustra come determinati dati devono essere impostati. Spero possa essere d'aiuto.

$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

grazie per la risposta. 'setTeinte' è una chiamata per impostare un valore stringa per un attributo che ho creato nel pannello di amministrazione (e ci sono molte altre chiamate del genere). Leggere il tuo codice mi ha davvero aiutato a scoprire la soluzione. Stavo impostando tutti questi valori come stringhe .. quindi sono riuscito a digitare il cast quando necessario e l'aggiornamento è ok. grazie. –

+0

hai idea da dove vengono questi avvisi? l'aggiornamento è ok, ma i messaggi arrivano ancora nel file di registro .... –

+3

Alla fine ho fatto deselezionare l'avviso dal log impostando l'id del negozio prima di eseguire il processo di creazione/aggiornamento ('Mage :: app() -> setCurrentStore (Mage :: getModel ('core/store') -> load (Mage_Core_Model_App :: ADMIN_STORE_ID)); ') ... –

18

L'aggiunta di Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); prima di salvare il prodotto risolve l'errore. Il codice di esempio riportato di seguito aggiorna il costo del prodotto.

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

Grazie per la tua risposta.it mi ha aiutato a risolvere il problema. –

0

facile con Magento API, anche possibile utilizzare i metodi ....

esempio

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

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

anche possibile impostare la modalità di amministrazione

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

Si prega di giustificare la risposta e spiegare come funziona il codice fornito. Ciò aiuterà il PO a capire meglio. – Ferrrmolina

Problemi correlati