Magento:无效的属性名称错误

时间:2012-03-30 16:51:47

标签: magento

我试图将所有产品存放在某个类别下
一切都写得很好:

$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中将它添加到我的查询中呢?

3 个答案:

答案 0 :(得分:1)

你必须使用

->addFieldToFilter( 'position', 'notnull' )

有关更多信息,请查看there

答案 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();



注意:
显然,覆盖以前的核心文件而不是直接修改它们会更好。