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

12

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

Я нашел ниже скрипт здесь :

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

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

$product->getResource()->saveAttribute($product, 'name');
Рони
источник

Ответы:

32

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

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

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

Как указывал OP, это довольно тяжело только для изменения одного атрибута. Я решил, что инструмент массового обновления атрибутов должен использовать более чистый способ, и нашел 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 секунд

Сандер Мангель
источник
Спасибо за ответ Но вышеприведенный скрипт требует больше времени с момента загрузки модели. Спасибо за ответ Но вышеприведенный скрипт требует больше времени с момента загрузки модели.
Рони
Я сделал обновление кода
Сандер Мангель
Пожалуйста. На самом деле я уже реализовал 2 сценария импорта, и это экономит много времени.
Сандер Мангель
Небольшой вопрос: это был не тот ответ, который вы искали? Если нет, дайте мне знать, если это так, пожалуйста, закройте вопрос, чтобы увеличить частоту ответов на наши вопросы :)
Сандер Мангель
11

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

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

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

От
источник
Спасибо за сообщение и поддержание его в актуальном состоянии. Но я вижу странное поведение. Как это сохранить всегда дал мне лучшее время. Но в последнее время в 2 экземплярах Magento EE это также требует времени для завершения сохранения. Может ли это быть связано с некоторым расширением в этом случае. Я не могу думать ни о какой другой проблеме. Эти экземпляры Magento в настоящее время включены локальной системой разработки, и я еще не перенес их на экземпляр тестового сервера.
Вылет
@Fra вы должны запустить тот же тест, что и Сандер - было бы хорошим сравнением!
Робби Аверилл