循环通过Magento属性值会跳过第一个项目

时间:2012-06-21 02:20:35

标签: magento loops attributes foreach

这是一个运行以下代码的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包含一个包含三个产品ID的数组。我的输出是回显第二个和第三个ID的罚款的属性值,但是没有回显第一个ID!

我根本得不到这个!为什么它会完全跳过循环中的第一个ID而不回显任何内容,同时回显下面的ID没有问题?

属性设置正确,无论我如何重新排列$ violins数组中的ID,都会跳过第一个属性值。我错过了什么?

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分: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'));
}