Como economizar valor para um atributo de produto [personalizado] específico do modelo de produto

12

Como economizar valor para um Atributo de Produto [personalizado] específico do Modelo de Produto?

Encontrei o script abaixo a partir daqui :

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

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

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

Respostas:

32

Existem duas maneiras de fazer isso: obter o catalog/productmodelo Magento e carregar o produto por ID, que fornecerá todo o produto, depois definir o nome e salvá-lo.

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

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

Como o OP apontou, isso é bastante pesado apenas para alterar um atributo. Eu pensei que a ferramenta de atualização em massa de atributos deveria usar uma maneira mais limpa de fazer isso e encontrei a Mage_Catalog_Model_Resource_Product_Actionclasse

$product_id = 1;
$store_id = 0;

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

Referência [UPDATE]

O mesmo aconteceu com um script de benchmark rápido e os resultados falam por si.

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

Tempo: 0.076527833938599 segundos

Tempo: 4.757472038269 segundos

Sander Mangel
fonte
Obrigado pela resposta Mas o script acima leva mais tempo desde que carrega o modelo. Obrigado pela resposta Mas o script acima leva mais tempo desde que carrega o modelo.
Roney
Eu fiz uma atualização do código
Sander Mangel
Seja bem-vindo. Na verdade, eu já implementei em 2 scripts de importação e economiza muito tempo.
Sander Mangel
Pequena pergunta: essa não era a resposta que você estava procurando? Se não deixe-me saber, em caso afirmativo por favor, feche a questão de manter a nossa taxa de pergunta-se respondidas :)
Sander Mangel
11

Se você precisar salvar apenas um atributo e já tiver o produto carregado, também poderá usar este método:

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

Este método é muito mais rápido que catalog/resource_product_action

Fra
fonte
Obrigado pela postagem e por mantê-la atualizada. Mas eu vejo um comportamento estranho. Assim, esse salvamento sempre me dava o melhor tempo. Mas ultimamente, em 2 instâncias do Magento EE, isso também leva tempo para concluir o Save. Poderia ser devido a alguma extensão nessas instâncias. Não consigo pensar em outra questão. Atualmente, essas instâncias do Magento estão ativadas pelo sistema local de desenvolvimento e ainda precisam transferi-las para uma instância do servidor de teste.
zapping
@Fra, você deve executar a mesma referência que Sander executou - seria uma boa comparação!
Robbie Averill