2012-06-21 107 views
0

這是運行下面的代碼的文件AJAX:通過Magento的循環屬性值跳過該第一項

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

$小提琴包含有三個產品ID的數組。我的輸出回顯第二個和第三個ID的屬性值很好,但不回顯第一個ID!

我不明白這一點!爲什麼它會完全跳過循環中的第一個ID並且不迴應任何內容,同時回顯以下ID沒有問題?

屬性設置正確,無論我如何重新排列$ violins數組中的ID,第一個屬性值總是被跳過。我錯過了什麼?

回答

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; 
    } 
} 

或者,如benmarks建議,通過收集加載此數據:

$_products = Mage::getModel('catalog/product')->getCollection() 
    ->addAttributeToSelect('Violinmodel') 
    ->addIdFilter($violins); 
foreach ($_products as $_product) { 
    echo $_product->getAttributeText('Violinmodel')); 
} 
1

當您遍歷Magento中的產品集合時,它包含的項目實際上是產品對象實例。你在這裏做什麼(多次訪問數據庫,加載所有屬性)是不必要的,因爲你試圖完成的任務(獲得一個屬性)。嘗試添加屬性的集合開始,並遍歷它:

$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)); 
}