Cómo guardar valor para un atributo de producto [personalizado] específico del modelo de producto

12

¿Cómo guardar valor para un atributo de producto específico [personalizado] del modelo de producto?

He encontrado el siguiente script desde aquí :

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

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

$product->getResource()->saveAttribute($product, 'name');
Roney
fuente

Respuestas:

32

Hay dos formas de hacerlo, una es obtener el catalog/productmodelo de Magento y cargar el producto por ID que le dará el producto completo, luego establecer el nombre y guardarlo.

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

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

Como OP señaló, esto es bastante pesado solo para cambiar un atributo. Me imaginé que la herramienta de actualización masiva de atributos debería usar una forma más limpia de hacer esto y encontré la Mage_Catalog_Model_Resource_Product_Actionclase

$product_id = 1;
$store_id = 0;

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

[ACTUALIZACIÓN] punto de referencia

También lo hizo un script de referencia rápido y los resultados hablan por sí mismos.

$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";

Tiempo: 0.076527833938599 segundos

Tiempo: 4.757472038269 segundos

Sander Mangel
fuente
Gracias por la respuesta Pero el script anterior lleva más tiempo ya que carga el modelo. Gracias por la respuesta Pero el script anterior lleva más tiempo ya que carga el modelo.
Roney
He hecho una actualización del código
Sander Mangel
De nada. De hecho, ya lo implementé en 2 scripts de importación y ahorra mucho tiempo.
Sander Mangel
Pequeña pregunta: ¿esta no era la respuesta que buscabas? Si no, hágamelo saber, si es así, cierre la pregunta para mantener nuestra tasa de preguntas respondidas :)
Sander Mangel
11

Si necesita guardar un solo atributo y ya tiene el producto cargado, también puede usar este método:

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

Este método es mucho más rápido que catalog/resource_product_action

Fra
fuente
Gracias por la publicación y por mantenerla actualizada. Pero veo un comportamiento extraño. Al igual que este guardar siempre me dio el mejor momento. Pero últimamente, en 2 instancias de Magento EE, esto también toma tiempo para completar el Guardar. ¿Podría ser debido a alguna extensión en estas instancias? No se me ocurre ningún otro problema. Actualmente, estas instancias de Magento están activadas por el sistema de desarrollo local y todavía tengo que transferirlas a una instancia del servidor de prueba.
zapping
@Fra, debe ejecutar el mismo punto de referencia que Sander ejecutó, ¡sería una buena comparación!
Robbie Averill