Обновление продуктов программно в Magento - PullRequest
13 голосов
/ 29 сентября 2011

Я работаю над сценарием, который будет создавать или обновлять продукты в моем каталоге.
Этот сценарий отлично работает, когда необходимо создать продукт, но не работает, когда продукт уже существует в базе данных, дающей мне (многиераз) следующие сообщения:

2011-09-30T08: 00: 53 + 00: 00 ERR (3): исправимая ошибка: аргумент 3 передан в Mage_Catalog_Model_Resource_Eav_Mysql4_Abstract :: _ canUpdateAttribute () должен быть массивом, задано нулевое значение, вызвано ...
2011-09-30T08: 00: 53 + 00: 00 ERR (3): исправимая ошибка: аргумент 3, переданный в Mage_Eav_Model_Entity_Abstract :: _ canUpdateAttribute (), должен быть массивом, заданным нулевым значением, вызванный в ...
2011-09-30T08: 00: 53 + 00: 00 ERR (3): Предупреждение: array_key_exists () [function.array-key-существующие]: второй аргумент должен быть либо массивомили объект в ...

Я искал метод, указанный в сообщении, но не могу найти причину сбоя сценария.
Сначала сценарий пытаетсязагрузить продукт, используя:

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

Возможно, кто-то уже сталкивался с той же проблемой.
Любая помощь приветствуется!Спасибо.

Ответы [ 5 ]

23 голосов
/ 30 сентября 2011

Скорее всего, в ваших "вызовах сеттера" вы пытаетесь установить что-то, что не может быть напрямую установлено в $ 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++;
} 
20 голосов
/ 12 сентября 2013

Добавление 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();
0 голосов
/ 24 марта 2017
<?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 голосов
/ 25 марта 2014
//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 голосов
/ 29 января 2014

Легко с Magento API, также можно использовать методы ....

пример

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