製品モデルから特定の[カスタム]製品属性の値を保存する方法


12

製品モデルから特定の[カスタム]製品属性の値を保存する方法は?

私はここから以下のスクリプトを見つけました:

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

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

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

回答:


32

これを行うには2つの方法があります。1つは、Magento catalog/productモデルを取得し、IDで製品をロードして製品全体を取得し、名前を設定して保存する方法です。

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

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

OPが指摘したように、これは1つの属性を変更するためだけに非常に重いです。属性一括更新ツールはこれを行うためのよりクリーンな方法を使用する必要があると考え、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

1つの属性のみを保存する必要があり、既に製品がロードされている場合は、このメソッドも使用できます。

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

この方法は、 catalog/resource_product_action


投稿いただきありがとうございます。しかし、奇妙な動作が見られます。このようなセーブは常に最高の時間を与えてくれました。しかし最近、2つのMagentoインスタンスEEのインスタンスでは、これも保存を完了するのに時間がかかります。これらのインスタンスの何らかの拡張が原因である可能性があります。他の問題は考えられません。これらのMagentoインスタンスは現在、ローカル開発システムによってオンになっており、まだテストサーバーインスタンスに転送されていません。
ザッピング

@Fraは、Sanderが実行したのと同じベンチマークを実行する必要があります-これは良い比較です!
ロビーアベリル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.