Как сохранить значение для определенного [пользовательского] атрибута продукта из модели продукта


Как сохранить значение для Определенного [пользовательского] атрибута продукта из модели продукта?

Я нашел приведенный ниже сценарий из здесь :

$product = Mage::getModel('catalog/product')->load(1); 

$product->setName('Some Random Name'); 

$product->getResource()->saveAttribute($product, 'name');
Author: Teja Bhagavan Kollepara, 2013-09-19

2 answers

Для этого есть 2 способа, один из которых - получить модель Magento catalog/product и загрузить продукт по идентификатору, который даст вам весь продукт, затем задать имя и сохранить его.

$product = Mage::getModel('catalog/product')->load(1);
$product->setName('foobar!');

try {
   $product->save();
} catch(Exception $e) {
  echo "{$e}";
}

Как указывал ОП, это довольно тяжело только для изменения одного атрибута. Я вроде как понял, что инструмент массового обновления атрибутов должен использовать более чистый способ сделать это, и нашел класс Mage_Catalog_Model_Resource_Product_Action

$product_id = 1;
$store_id = 0;

$action = Mage::getModel('catalog/resource_product_action');
$action->updateAttributes(array($product_id), array(
    'name' => 'foobar!'
), $store_id);

[ ОБНОВЛЕНИЕ] контрольный показатель

Так же сделал быстрый тестовый скрипт и результаты говорят сами за себя.

$starttime = microtime(true);

for ($i=20; $i>0; $i--)
{
    $action = Mage::getModel('catalog/resource_product_action');
    $action->updateAttributes(array(1), array(
        'name' => 'foobar!'
    ), 0);
}

echo "Time: " . (microtime(true) - $starttime) . " seconds\n";

$starttime = microtime(true);

for ($i=20; $i>0; $i--)
{
    $product = Mage::getModel('catalog/product')->load(1);
    $product->setName('foobar!');
    $product->save();
    unset($product);
}

echo "Time: " . (microtime(true) - $starttime) . " seconds\n";

Время: 0,076527833938599 секунд

Время: 4,757472038269 секунд

 32
Author: Sander Mangel, 2013-09-19 11:48:00

Если вам нужно сохранить только один атрибут, и у вас уже загружен продукт, вы также можете использовать этот метод:

$product->setData('attribute_code',$someData);
$product->getResource()->saveAttribute($product,'attribute_code');

Этот метод намного быстрее, чем catalog/resource_product_action

 11
Author: Fra, 2016-02-08 06:36:54