Comment enregistrer la valeur d'un attribut de produit [personnalisé] spécifique à partir du modèle de produit

12

Comment économiser de la valeur pour un attribut de produit [personnalisé] spécifique à partir du modèle de produit?

J'ai trouvé le script ci-dessous à partir d' ici :

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

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

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

Réponses:

32

Il y a 2 façons de procéder, l'une consiste à obtenir le catalog/productmodèle Magento et à charger le produit par ID qui vous donnera le produit entier, puis à définir le nom et à l'enregistrer.

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

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

Comme OP l'a souligné, c'est assez lourd juste pour changer un attribut. J'ai en quelque sorte pensé que l'outil de mise à jour en masse des attributs devrait utiliser une façon plus propre de le faire et j'ai trouvé 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);

[UPDATE] benchmark

Tout comme un script de référence rapide et les résultats parlent d'eux-mêmes.

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

Temps: 0.076527833938599 secondes

Temps: 4.757472038269 secondes

Sander Mangel
la source
Merci pour la réponse Mais le script ci-dessus prend plus de temps depuis qu'il charge le modèle .Merci pour la réponse Mais le script ci-dessus prend plus de temps depuis qu'il charge le modèle.
Roney
J'ai fait une mise à jour du code
Sander Mangel
Je vous en prie. En fait, j'ai déjà implémenté 2 scripts d'importation et cela fait gagner beaucoup de temps.
Sander Mangel
Petite question: ce n'était pas la réponse que vous cherchiez? Sinon, faites-le moi savoir, si c'est le cas, veuillez fermer la question pour maintenir notre taux de réponses à des questions :)
Sander Mangel
11

Si vous devez enregistrer un seul attribut et que le produit est déjà chargé, vous pouvez également utiliser cette méthode:

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

Cette méthode est beaucoup plus rapide que catalog/resource_product_action

Fra
la source
Merci pour le message et pour l'avoir mis à jour. Mais je vois un comportement étrange. Comme cette sauvegarde m'a toujours donné le meilleur temps. Mais récemment, dans 2 instances Magento EE, cela prend aussi du temps pour terminer la sauvegarde. Serait-ce dû à une extension de ces instances. Je ne peux penser à aucun autre problème. Ces instances Magento sont actuellement activées par le système de développement local et doivent encore être transférées vers une instance de serveur de test.
zapping du
@Fra, vous devez exécuter le même benchmark que Sander - ce serait une bonne comparaison!
Robbie Averill