2

属性の値に基づいて製品のみを表示する私のニーズに合わせて 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 ページが表示され、フィルター処理されたすべての本が 1 ページに表示されます (英語の本が 18 冊あるため、18 本のうち 7 ページが複製されます)。

このページネーションの問題を解決するのに誰か助けてください。

ありがとう。

コレクションの 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')
4

2 に答える 2

5

これを list.phtml ファイルで使用します。

$_productCollection->clear()
    ->addAttributeToFilter('attribute_set_id', array('eq' => 63))
    ->load();
于 2013-04-19T06:48:15.077 に答える
4

私の推測では、製品表示フィルターが欠落しているため、製品数が間違っていると思われます。次のように追加してみてください。

$_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()
   );

添加:

に設定するカスタム コレクションはlist.phtml、システムがページネーターで使用するものとは異なります。ページネーター ブロックは、フィルターを持たないMage_Catalog_Block_Product_List_Toolbar元の製品コレクションを$this->_getProductCollection()(こちらを参照) から取得します。

残念ながら、テンプレート ファイルのコレクションを変更するだけでは十分ではありません。必要なフィルタリングを実装するには、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;
}
于 2013-01-29T10:54:53.640 に答える