Come salvare il valore per un attributo prodotto [personalizzato] specifico dal modello prodotto


12

Come risparmiare valore per un attributo prodotto [personalizzato] specifico dal modello prodotto?

Ho trovato lo script qui sotto da qui :

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

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

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

Risposte:


32

Ci sono 2 modi per farlo, uno è ottenere il catalog/productmodello Magento e caricare il prodotto per ID che ti darà l'intero prodotto, quindi impostare il nome e salvarlo.

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

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

Come sottolineato da OP, questo è piuttosto pesante solo per la modifica di un attributo. Ho pensato che lo strumento di aggiornamento di massa degli attributi dovrebbe usare un modo più pulito per farlo e ho trovato la 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);

Benchmark [AGGIORNAMENTO]

Così ha fatto un rapido script di benchmark e i risultati parlano da soli.

$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 secondi

Tempo: 4,757472038269 secondi


Grazie per la risposta Ma sopra lo script richiede più tempo dal momento in cui carica il modello. Grazie per la risposta Ma sopra lo script richiede più tempo dal momento in cui carica il modello.
Roney,

Ho fatto un aggiornamento del codice
Sander Mangel

Prego. In realtà l'ho già implementato in 2 script di importazione e mi fa risparmiare molto tempo.
Sander Mangel

Piccola domanda: questa non era la risposta che cercavi? In caso contrario, fammi sapere, in tal caso, per favore chiudi la domanda per mantenere alto il nostro tasso di domande con risposta :)
Sander Mangel

11

Se devi salvare solo un attributo e hai già caricato il prodotto, puoi utilizzare anche questo metodo:

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

Questo metodo è molto più veloce di catalog/resource_product_action


Grazie per il post e per mantenerlo aggiornato. Ma vedo uno strano comportamento. In questo modo il salvataggio mi ha sempre dato il miglior tempo. Ma ultimamente in 2 casi di Magento in EE anche questo richiede tempo per completare il salvataggio. Potrebbe essere dovuto a qualche estensione in queste istanze. Non riesco a pensare a nessun altro problema. Queste istanze di Magento sono attualmente attive dal sistema di sviluppo locale e devono ancora trasferirlo su un'istanza del server di prova.
zapping

@Fra dovresti eseguire lo stesso benchmark di Sander - sarebbe un buon confronto!
Robbie Averill
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.