我试图将所有产品存放在某个类别下
一切都写得很好:
$category = Mage::getModel('catalog/category')->load($categoryId);
$products = Mage::getModel('catalog/product')
->getCollection()
->addCategoryFilter($category)
->setOrder('position', 'DESC')
->load();
我已按照其位置属性正确排序所有产品 由于他们中的一些人没有任何职位设置,我想排除他们,所以我试着简单地说:
$category = Mage::getModel('catalog/category')->load($categoryId);
$products = Mage::getModel('catalog/product')
->getCollection()
->addCategoryFilter($category)
->addFieldToFilter( 'position', array('gt'=>0) )
->setOrder('position', 'DESC')
->load();
但该页面无法加载,我收到错误消息“处理您的请求时出错”#39;并且错误日志存储在以
开头的var / report下a:5:{i:0; s:33:"属性名称无效:位置。
我无法解决这个问题..我搜索了很多并尝试了很多解决方案,但没有人工作。
我无法理解为什么它接受一个attribut进行排序而不进行过滤。
有什么想法?
编辑:
$ products执行的查询是
SELECT
`e`.*,
`cat_index`.`position` AS `cat_index_position`,
`price_index`.`price`,
`price_index`.`tax_class_id`,
`price_index`.`final_price`,
IF(`price_index`.`tier_price`, LEAST(`price_index`.`min_price`, `price_index`.`tier_price`),
`price_index`.`min_price`) AS `minimal_price`,
`price_index`.`min_price`,
`price_index`.`max_price`,
`price_index`.`tier_price`
FROM
`tb_catalog_product_entity` AS `e`
INNER JOIN
`tb_catalog_category_product_index` AS `cat_index`
ON
cat_index.product_id=e.entity_id
AND
cat_index.store_id='3'
AND
cat_index.category_id='2476'
AND
cat_index.is_parent=1
INNER JOIN
`tb_catalog_product_index_price` AS `price_index`
ON
price_index.entity_id = e.entity_id
AND
price_index.website_id = '1'
AND
price_index.customer_group_id = 0
ORDER BY
`cat_index_position` ASC,
`cat_index`.`product_id` ASC
我也试过了:
$category = Mage::getModel('catalog/category')->load($categoryId);
$products = Mage::getModel('catalog/product')
->getCollection()
->addCategoryFilter($category)
->addFieldToFilter( 'cat_index_position', 'notnull' )
->setOrder('position', 'ASC')
->load();
结果相同:
Invalid attribute name: cat_index_position.";i:1;s:4700:"#0 /path/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(1155): Mage::exception('Mage_Eav', 'Invalid attribu...')
的编辑:
我认为我的问题类似于this one
但我无法弄清楚如何解决它!
的编辑:
也试过
$category = Mage::getModel('catalog/category')->load($categoryId);
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('cat_index_position')
->addAttributeToFilter('cat_index_position', array('gt'=>'0'));
始终存在相同的错误
的编辑:
如果我添加
WHERE `position` > 0
在我的查询浏览器中,它正在工作!
那么如何在magento中将它添加到我的查询中呢?
答案 0 :(得分:1)
答案 1 :(得分:1)
我有类似的问题,并通过添加:
解决$products->getSelect()
->joinLeft( array('category_product_index'=>Mage::getResourceModel('catalog/product_collection')->getTable('catalog/category_product_index')), '`e`.`entity_id` = `category_product_index`.`product_id`', array('position AS cat_index_position'))
->group('e.entity_id');
答案 2 :(得分:0)
到目前为止,我用这种方式解决了:
1)修改后的
应用程序/代码/核心/法师/ EAV /型号/实体/ Abstract.php
~line 384
if (empty($attributeInstance)
|| !($attributeInstance instanceof Mage_Eav_Model_Entity_Attribute_Abstract)
|| (!$attributeInstance->getId() && !in_array($attributeInstance->getAttributeCode(), $this->getDefaultAttributes()))
) {
return false;
}
到
if (empty($attributeInstance)
|| !($attributeInstance instanceof Mage_Eav_Model_Entity_Attribute_Abstract)
// || (!$attributeInstance->getId() && !in_array($attributeInstance->getAttributeCode(), $this->getDefaultAttributes()))
) {
return false;
}
2)修改了
应用程序/代码/核心/法师/ EAV /型号/实体/收集/ Abstract.php
~line 1237
if ($entity->isAttributeStatic($attribute)) {
$conditionSql = $this->_getConditionSql('e.'.$attribute, $condition);
} else {
....
到
if ($entity->isAttributeStatic($attribute)) {
$conditionSql = $this->_getConditionSql('e.'.$attribute, $condition);
$attributeInstance = Mage::getSingleton('eav/config')
->getAttribute($this->getAttribute($attribute)->getEntityType(), $attribute);
if (!$attributeInstance->getId() && !in_array($attributeInstance->getAttributeCode(), $this->getAttribute($attribute)->getDefaultAttributes()))
{
// die( "FOUND".$attribute );
$conditionSql = $this->_getConditionSql($attribute, $condition);
}
} else {
...
最后我可以按位置过滤我的收藏:
$category = Mage::getModel('catalog/category')->load($categoryId);
$products = Mage::getModel('catalog/product')
->getCollection()
->addCategoryFilter($category)
->addAttributeToFilter('position', array('gt'=>'0'))
->setOrder('position', 'ASC')
->load();
注意:强>
显然,覆盖以前的核心文件而不是直接修改它们会更好。