2011-09-29 18 views
12

Pracuję nad skryptem, który utworzy lub zaktualizuje produkty w moim katalogu.
Skrypt działa poprawnie, gdy produkt musi zostać utworzony, ale nie wtedy, gdy produkt znajduje się już w bazie danych, dając mi (wiele razy) następujące komunikaty:Aktualizuj produkty programowo w 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 ...

Szukałem w metodzie cytowane w wiadomości, ale nie mogę znaleźć żadnego powodu, dla którego skrypt się nie powiedzie.
Skrypt najpierw spróbować załadować towar za pomocą:

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

a następnie testu jeżeli produkt został pobrany za pomocą prostego if(!$product) { //creation }.
Cały kod występujący po instrukcji if jest udostępniany do utworzenia lub aktualizacji i składa się z wywołań kreatora na obiekcie produktu.

Oto kod używam:

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

Może ktoś już w obliczu tego samego problemu.
Każda pomoc jest mile widziana! Dziękuję Ci.

+0

Może możemy Ci pomóc, jeśli umieścisz odpowiednią część skryptu. Zwłaszcza z linią powodującą błąd, ponieważ w tej chwili tylko wiesz, co instrukcja wyzwala błąd. –

+0

Zgadza się, będę edytować pytanie. Dziękuję Ci. –

+0

Wiem, że błąd pochodzi z '$ product-> save();' ale nie wiem dlaczego. Kiedy loguję produkt, widzę, że jest poprawnie załadowany. Myślałem, że proste wywołanie metody 'save()' spowodowałoby aktualizację –

Odpowiedz

21

Są szanse, że podczas "wywoływania setera" próbujesz ustawić coś, czego nie można ustawić bezpośrednio na produkcie $. Może to być nawet "setTeinte", ponieważ nie jestem pewien, co to próbuje ustawić. Ale ponieważ nie widzimy całego twojego kodu, jest to trochę trudne do powiedzenia, więc jak poprowadzę, spójrz na poniższy kod, który ustawia pewne informacje bezpośrednio na temat produktu, a następnie poziomu zapasów. W związku z tym ilustruje sposób ustalania niektórych danych. Mam nadzieję, że to pomoże.

$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

dziękuję za odpowiedź. 'setTeinte' to wywołanie do ustawienia wartości ciągu dla atrybutu, który utworzyłem w panelu administracyjnym (i jest tam wiele innych podobnych połączeń). Przeczytanie kodu naprawdę pomogło mi znaleźć rozwiązanie. Ustawiłem te wszystkie wartości jako ciągi .. więc udało mi się wpisać rzut w razie potrzeby, a aktualizacja jest w porządku. Dziękuję Ci. –

+0

Czy masz pojęcie skąd pochodzą te ostrzeżenia? aktualizacja jest w porządku, ale wiadomości nadal znajdują się w pliku dziennika .... –

+3

W końcu ostrzeżenie zniknęło z logu, ustawiając identyfikator sklepu przed wykonaniem procesu tworzenia/aktualizacji ('Mage :: app() -> setCurrentStore (Mage :: getModel ('core/store') -> load (Mage_Core_Model_App :: ADMIN_STORE_ID)); ') ... –

18

Dodanie Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); przed zapisaniem produktu rozwiązuje problem. Poniższy przykładowy kod aktualizuje koszt produktu.

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

Dzięki za answer.it pomógł mi rozwiązać problem. –

0

Łatwy z Magento API także mogą korzystać z metod ....

przykład

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

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

Ponadto można ustawić tryb Admin

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

Proszę uzasadnić swoją odpowiedź i wyjaśnić, jak działa kod, który podasz. Pomoże to OP zrozumieć lepiej. – Ferrrmolina

Powiązane problemy