我已经搜索了好几个小时,我似乎无法得到一个好的答案。
我有很多不同的产品,还有一堆不同的属性和属性集。
我希望计算整个属性列表中具有有效属性值的产品数量。因此,我想循环遍历每个属性,然后计算具有该属性的产品数量,并为该属性提供良好的值。
我们所有的属性都来自第三方。因此,他们通常要么将值保留为空白,要么将它们放在" 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个属性都可用于分层导航。所以,如果有人有更好的解决分层导航问题的方法,我也会听到所有的耳朵。
提前致谢!
答案 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_”前缀的属性。