Magento - 按属性获取产品数量

时间:2015-04-01 16:35:18

标签: magento

我已经搜索了好几个小时,我似乎无法得到一个好的答案。

我有很多不同的产品,还有一堆不同的属性和属性集。

我希望计算整个属性列表中具有有效属性值的产品数量。因此,我想循环遍历每个属性,然后计算具有该属性的产品数量,并为该属性提供良好的值。

我们所有的属性都来自第三方。因此,他们通常要么将值保留为空白,要么将它们放在" N / A"。

我现在面临的问题是,我甚至无法获得具有该特定属性的产品。 ' notnull'过滤器对我不起作用。我尝试过这么多不同的方式。这是我目前的代码,它不起作用,但看起来最有希望。我会告诉你这个错误,但如果有人有解决方案,我很乐意与你分享。

    $productAttrs = Mage::getResourceModel('catalog/product_attribute_collection');
    $x = 0;
    foreach ($productAttrs as $productAttr) { 
        $collection_size = Mage::getModel('catalog/product')->getCollection()
            ->addAttributeToSelect($productAttr->getAttributeCode())
            ->addAttributeToFilter(
                array
                (
                    array
                    (
                        'attribute' => $productAttr->getAttributeCode(), 
                        'notnull' => true
                    ),
                    array
                    (
                        'attribute' => $productAttr->getAttributeCode(),
                        'nin' => array('N/A', '', ' ')
                    )
                )
            );
        echo count($collection_size->getData());
        echo "<br>";
        $x++;
        if($x>50) {
            break;
        }
    }

因此,对于上述情况,我只展示了前50个属性。此特定代码实际上给出了错误。它只显示第一个属性的计数后给出错误,所以我认为这只是因为需要忽略category_id属性(我现在就这样做),但它看起来并不算数正确的产品 - 当我知道并非所有产品都具有相关的特定属性时,它似乎给出了商店中所有产品的价值。

Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'at_category_ids.category_ids' in 'field list'' in /var/www/html/store/lib/Zend/Db/Statement/Pdo.php:228

我不确定从哪里开始。

另外,我这样做的原因.....我有分层导航,只想在超过200种产品中正确设置的属性。我不希望所有4000个属性都可用于分层导航。所以,如果有人有更好的解决分层导航问题的方法,我也会听到所有的耳朵。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这就是我的所作所为。我仍然需要弄清楚我要用于给定属性的数量,并将属性设置为可用于分层导航,但是这将通过并找出对于给定属性具有看似良好值的产品数量。

如果您愿意,可以通过包含类似.....

的内容打印出每个属性的产品数量
                echo $productAttr->getAttributeCode();
                echo " : ";
                echo count($collection->getData());             
                echo "<br>";

把它放在“收集”代码之后的某个地方。

    //get list of attributes
    $productAttrs = Mage::getResourceModel('catalog/product_attribute_collection');
    $x = 0;
    $y = array();
    //go through each attribute and get the number of products that exist for that attribute
    foreach ($productAttrs as $productAttr) { 
        //exclude attributes that don't match criteria
        if($productAttr->getAttributeCode() == 'category_ids' || substr($productAttr->getAttributeCode(), 0, 2) != 'i_') {
                continue;
        }
        //get attributes that match the following
        $collection = Mage::getModel('catalog/product')->getCollection()
            ->addAttributeToSelect($productAttr->getAttributeCode())
            ->addAttributeToFilter(
                array
                (
                    array
                    (
                        'attribute' => $productAttr->getAttributeCode(), 
                        'notnull' => true
                    ),
                    array
                    (
                        'attribute' => $productAttr->getAttributeCode(),
                        'nin' => array('N/A', '', ' ')
                    )
                )
            );
        //use y array to count how many attributes have more than certain amount of products
        //this loop will give 100, 200, 300, 400, 500, 600, 700, 800, 900, and 1000
        //loops backwards and breaks if count is over the current number 
        for($z=0; $z<=10; $z++) {
            if(count($collection->getData()) > $z*100)  {
                $y[$z]++;
                // break;
            }
        }
        $x++;
    }
    //after finding out numbers, print the results
    $number_over = 0;
    foreach($y as $num) {
        $number_under = $number_over+100;
        echo "<br>Total number of attributes that are set in over " . $number_over;
        echo " products total is: " .$num;
        $number_over = $number_over + 100;
    }
}

编辑: 正如我之前所说,我使用icecat进行产品联合。所以,我只想看看没有引号的带有“i_”前缀的icecat属性。所以,我排除了所有没有“i_”前缀的属性。