Magento - list.phtml фильтрация коллекции продуктов, не дающая правильной разбивки на страницы

Я пытаюсь отфильтровать list.phtml в соответствии с моими потребностями, которые показывают только продукты, основанные на значении атрибута. Исходный код для загрузки коллекции продуктов:

$_productCollection=$this->getLoadedProductCollection();
$_helper = $this->helper('catalog/output');

Чтобы сделать фильтрацию, у меня есть код:

$_productCollection=$this->getLoadedProductCollection();

$cat_id = Mage::getModel('catalog/layer')->getCurrentCategory()->getId();
$_productCollection = Mage::getResourceModel('catalog/product_collection')
   ->addAttributeToFilter('language', array('eq' => array('English')))
   ->addAttributeToSelect('*')
   ->addCategoryFilter(Mage::getModel('catalog/category')->load($cat_id));


$_helper = $this->helper('catalog/output');

Это работает, однако число страниц и общее число элементов (сгенерировано из toolbar.phtml и pager.phtml неверно. Например, исходная коллекция продуктов имеет правильную разбивку на страницы 7 страниц и 10 продуктов на страницу.

Однако, когда я использую фильтр, показанный выше, разбиение на страницы отображает те же 7 страниц и каждую отфильтрованную книгу на одной странице (есть 18 английских книг, поэтому 7 страниц из 18 книг, которые дублируются).

Пожалуйста, помогите мне в решении этой проблемы с разбивкой по страницам.

Благодарю.

SQL для коллекции выглядит следующим образом:

 SELECT `e`.*, `at_language`.`value` AS `language`, `cat_index`.`position`
 AS `cat_index_position` FROM `catalog_product_entity`
 AS `e` INNER JOIN `catalog_product_entity_varchar`
 AS `at_language` ON (`at_language`.`entity_id` = `e`.`entity_id`) 
 AND (`at_language`.`attribute_id` = '1002') 
 AND (`at_language`.`store_id` = 0) 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.visibility IN(2, 4) AND cat_index.category_id='38' 
 AND cat_index.is_parent=1 WHERE (at_language.value = 'English')
2
nl ja de
вы могли бы разместить SQL, который был создан для вашей коллекции? Вы можете получить его с помощью $ _productCollection-> getSelect() -> __ toString ()
добавлено автор Oleg Ishenko, источник
см. дополнение к моему ответу
добавлено автор Oleg Ishenko, источник
Я отредактировал вопрос, чтобы показать SQL, который основан на коде коллекции в вашем ответе, спасибо.
добавлено автор user1669256, источник

2 ответы

Используйте это в файле list.phtml:

$_productCollection->clear()
    ->addAttributeToFilter('attribute_set_id', array('eq' => 63))
    ->load();
5
добавлено

Я предполагаю, что вы ошибаетесь в количестве товаров, потому что отсутствует фильтр видимости продукта. Попробуйте добавить его так:

$_productCollection = Mage::getResourceModel('catalog/product_collection')
   ->addAttributeToFilter('language', array('eq' => array('English')))
   ->addAttributeToSelect('*')
   ->addCategoryFilter(Mage::getModel('catalog/category')->load($cat_id))
   ->setVisibility(
       Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds()
   );

дополнение:

the custom collection you set to the list.phtml will not be the same the system uses in the paginator. The paginator block Mage_Catalog_Block_Product_List_Toolbar will get the original product collection from $this->_getProductCollection() (see here), which does not have your filter.

Боюсь, изменения в коллекции в файле шаблона недостаточно. Возможно, вам придется переопределить блок Mage_Catalog_Block_Product_List , в частности его функцию _getProductCollection() , чтобы реализовать необходимую фильтрацию.

добавление 2

Предлагаемое переопределение для функции Mage_Catalog_Block_Product_List :: _ getProductCollection :

protected function _getProductCollection()
{ 
    $collection = parent::_getProductCollection();
    $collection->addAttributeToFilter('language', array('eq' => array('English')));
    $this->_productCollection = $collection;

    return $this->_productCollection;
}
4
добавлено
да, класс блока для перезаписи находится в файле Mage/Catalog/Block/Product/List.php. Вы можете сделать более простой синтаксис, так как вам нужно добавить атрибут для фильтрации. См. Еще одно дополнение к ответу на предлагаемый переписать функцию Mage_Catalog_Block_Product_List :: _ getProductCollection
добавлено автор Oleg Ishenko, источник
не беспокойтесь о повышении, я рад помочь :)
добавлено автор Oleg Ishenko, источник
Если он использует несколько магазинов, он может получить и другой результат, если он так добавил и добавил в фильтр магазина :)
добавлено автор Andrew, источник
Спасибо за ваш ответ, я добавил это, но я все равно получаю тот же результат. Есть ли у вас другие предложения?
добавлено автор user1669256, источник
Я только что попробовал '-> addStoreFilter (1)', но я получаю тот же результат, это правильный код для добавления фильтра хранилища?
добавлено автор user1669256, источник
Спасибо за помощь. Я все еще новичок в этой области Мадженто. Я просмотрел файлы. Мне нужен файл для переопределения для «Маг/Каталог/Блок/Продукт/Список.php». Также будет ли синтаксис для написания фильтров таким же, как ранее в файлах шаблонов?
добавлено автор user1669256, источник
Я создал переопределение и использовал ваш код с добавлением 2. Он делает то, что мне нужно. Спасибо за помощь! К сожалению, мне нужно 15 очков репутации для голосования :( Еще раз спасибо!
добавлено автор user1669256, источник