0

これは、次のコードを実行する ajax ファイルです。

$model = Mage::getModel('catalog/product'); //getting product model
    foreach ($violins as $k => $v)
       {
           $_product = $model->load($v); //getting product object for particular product id
           $violinmodel = $_product->getAttributeText('Violinmodel'); //grabbing the violinmodel attribute value
           echo $violinmodel;
       }

$violin には、3 つの製品 ID を持つ配列が含まれています。私の出力は、2 番目と 3 番目の ID の属性値を正常にエコーしていますが、最初の ID はエコーしていません!

私はこれをまったく理解していません!ループ内の最初の ID を完全にスキップし、何もエコーしないのに、次の ID を問題なくエコーするのはなぜですか?

属性は適切に設定されており、$violins 配列の ID をどのように再配置しても、最初の属性値は常にスキップされます。私は何が欠けていますか?

4

2 に答える 2

1

Magento で製品コレクションを反復処理する場合、含まれるアイテムは実際には製品オブジェクト インスタンスです。ここで行っていること (データベースを複数回ヒットする、すべての属性をロードする) は、達成しようとしていること (1 つの属性を取得すること) を考えると不要です。最初にコレクションに属性を追加して、それを繰り返してみてください。

$coll = Mage::getModel('catalog/product')->getCollection()
                                           ->addAttributeToSelect('Violinmodel');
                                           //be certain that the attribute code is capitalized...

foreach ($coll as $product) {
    //var_dump($product->debug()); //for example
    var_dump($product->getAttributeText('Violinmodel));
}
于 2012-06-21T02:55:01.777 に答える
1

ループ外での初期化$modelは安全ではありません。メモリや関数呼び出しの効率が向上していると思われるかもしれませんが、それはトラブルの元です。オブジェクトはそのMage_Catalog_Model_Product時点でロードされており、呼び出し->load()によって新しいオブジェクトが提供されるのではなく、既存のオブジェクトのデータが設定されているだけです。ただし、すべてのデータが上書きされない場合、奇妙な動作が発生します (たとえば、ProductA に Violinmodel 属性があり、ProductB がない場合... ProductA.Violinmodel == ProductB.Violinmodel のようになります)。そのため、常にモデルをループ内に配置する必要があります。

foreach ($violins as $k => $v) {
    $_product = Mage::getModel('catalog/product')->load($v); //getting product
    if ($_product->getId() == $v) { // sanity check
        $violinmodel = $_product->getAttributeText('Violinmodel'); //grabbing the violinmodel attribute value
        echo $violinmodel;
    }
}

または、ベンチマークが示唆するように、コレクションを介してこのデータをロードします。

$_products = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('Violinmodel')
    ->addIdFilter($violins);
foreach ($_products as $_product) {
    echo $_product->getAttributeText('Violinmodel'));
}
于 2012-06-21T03:58:58.097 に答える