2012-03-30 3 views
0

Я пытаюсь получить все продукты, хранящиеся под определенной категорией.

Все работает отлично писать: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(); 

Но страница не может быть загружена, я получаю сообщение об ошибке «Там было ошибка при обработке запроса»и журнал ошибок хранится в вар/отчета, начиная с

а: 5: {я: 0; s: 33:" Неверное имя атрибута: позиция

и. Я не могу понять, чтобы решить это. Я много гулял и много пробовал решений, но никто не работал.
Я не могу понять, почему он принимает атрибут для сортировки, а не для фильтрации.
Любая идея?

EDITED:
Запрос осуществляется $ продуктов

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 , но я не могу понять, как ее решить!



EDITED:

Пытались также

$category = Mage::getModel('catalog/category')->load($categoryId); 

$products = Mage::getModel('catalog/product') 
      ->getCollection() 
      ->addAttributeToSelect('cat_index_position') 
      ->addAttributeToFilter('cat_index_position', array('gt'=>'0')); 

всегда один и тот же ошибку



EDITED:

Если добавить

WHERE `position` > 0 

В браузере запроса он работает!
Так как я могу добавить его в свой запрос в magento?

ответ

0

До сих пор я решил таким образом:
1) Модифицированный
приложение/код/​​ядро /Mage/Eav/Model/Entity/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) Модифицированный
приложение/код/​​ядро ​​/ Mage/Eav/модель/Entity/Коллекция/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(); 



Примечание:
Очевидно, что лучше переопределить предыдущие файлы ядро, а не изменять их непосредственно.

1

Вы должны использовать

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

Для получения дополнительной информации, смотрите there

+0

Это не работает, как хорошо. :(Я уже знал, что ссылка, однако, спасибо за обмен :) –

+0

Можете ли вы показать нам запрос, выполненный вашей коллекцией? – haltabush

+0

, пожалуйста, смотрите раздел «отредактированный» внутри моего вопроса, спасибо. –

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');