addCategoryFilter вообще не работает в Magento - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть категория «Новая», в которой 14 продуктов.

Я использую Mage::getModel('catalog/category')->load(6); для загрузки этой категории (6 - это идентификатор администратора).

Если я позвоню echo $category->getProductCount();, он правильно отображает 14 (количество товаров в этой категории).

Теперь я беру товары из категории с

$products = Mage::getModel('catalog/product')
    ->setStoreId( Mage::app()->getStore()->getId() )
    ->getCollection()
    ->addAttributeToFilter('visibility', $visibility)
    ->addCategoryFilter($category)
    ->addAttributeToSelect("*")
    ->setOrder('name','asc');

для отображения всех 14 из этих продуктов, затем используется простой цикл foreach(), но когда я перебираю объект $products, он фактически возвращает ВСЕ мои продукты.

Я использую версию 1.6.2.0, и я очистил свой кэш.

У кого-нибудь есть причина, почему это не работает?

РЕДАКТИРОВАТЬ

Вызов echo (string) $products->getSelect(); возвращает

SELECT `e`.*, IF(at_visibility.value_id > 0, at_visibility.value, at_visibility_default.value) AS `visibility`, `cat_index`.`position` AS `cat_index_position`, IF(at_name.value_id > 0, at_name.value, at_name_default.value) AS `name` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_product_entity_int` AS `at_visibility_default` ON (`at_visibility_default`.`entity_id` = `e`.`entity_id`) AND (`at_visibility_default`.`attribute_id` = '95') AND `at_visibility_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_int` AS `at_visibility` ON (`at_visibility`.`entity_id` = `e`.`entity_id`) AND (`at_visibility`.`attribute_id` = '95') AND (`at_visibility`.`store_id` = 1) INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.category_id='13' AND cat_index.is_parent=1 LEFT JOIN `catalog_product_entity_varchar` AS `at_name_default` ON (`at_name_default`.`entity_id` = `e`.`entity_id`) AND (`at_name_default`.`attribute_id` = '65') AND `at_name_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_varchar` AS `at_name` ON (`at_name`.`entity_id` = `e`.`entity_id`) AND (`at_name`.`attribute_id` = '65') AND (`at_name`.`store_id` = 1) WHERE (((IF(at_visibility.value_id > 0, at_visibility.value, at_visibility_default.value) = '4') OR (IF(at_visibility.value_id > 0, at_visibility.value, at_visibility_default.value) = '2'))) ORDER BY `name` as

1 Ответ

5 голосов
/ 29 февраля 2012

Это работает для меня, когда упрощено до:

$cat = Mage::getModel('catalog/product')->setId(198);

$products = Mage::getModel('catalog/product')
    ->getCollection()
    ->addCategoryFilter($cat)
    ->addAttributeToSelect("*")
    ->setOrder('name','asc')
    ->load();

foreach($products as $p) {
    print_r($p->getSku().PHP_EOL);
}

Кстати, SQL более читабелен (для меня, во всяком случае), если вы добавите вызов addAttributeToSelect сразу после getCollection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...