0

製品コレクションにアクティブ フィルターを適用する方法について、解決策を教えてください。

例えば:

$_category = Mage::getModel('catalog/category')->load($category_id);
$productsCollection = $_category->getProductCollection();

アクティブなフィルタを取得しています:

$_filters = Mage::getSingleton('catalog/layer')->getState()->getFilters();

$_filters を使用して $productsCollection の製品をフィルタリングするにはどうすればよいですか?

ご清聴ありがとうございました!

4

2 に答える 2

1

Magento は、関数Mage_Catalog_Model_Resource_Layer_Filter_Attribute::applyFilterToCollectionでフィルターをコレクションに適用します。そのロジックに従って、次のコードを使用できます。

$_filters = Mage::getSingleton('catalog/layer')->getState()->getFilters();
$productsCollection = $_category->getProductCollection();
foreach ($_filters as $filterItem) {
    $filter = $filterItem->getFilter(); /**Mage_Catalog_Model_Layer_Filter_Attribute**/
    $attribute  = $filter->getAttributeModel();
    $connection = Mage::getSingleton('core/resource')->getConnection('core_read');
    $tableAlias = $attribute->getAttributeCode() . '_idx';
    $conditions = array(
        "{$tableAlias}.entity_id = e.entity_id",
        $connection->quoteInto("{$tableAlias}.attribute_id = ?",
        $attribute->getAttributeId()),
        $connection->quoteInto("{$tableAlias}.store_id = ?", $collection->getStoreId()),
            $connection->quoteInto("{$tableAlias}.value = ?", $value)
        );

    $productsCollection->getSelect()->join(
        array($tableAlias => $filter->getResource()->getMainTable()),
        implode(' AND ', $conditions),
        array()
        );

}
于 2013-02-21T16:03:19.850 に答える
1

カテゴリを選択するときに表示されるエラーは、フィルター オブジェクトが typeMage_Catalog_Model_Layer_Filter_Categoryであり、プロパティを持たないというものattribute_modelです。これを防ぐには、フィルタ ループにチェックを追加する必要があります。

foreach($_filters as $filterItem)
{
    $filter = $filterItem->getFilter();
    if (!($filter instanceof Mage_Catalog_Model_Layer_Filter_Attribute)) {
        continue;
    }

複数の選択フィルター値の問題も、2 つの方法で解決できます。フィルター値を OR 方式で適用する場合は、次のようにします。

   $connection->quoteInto("{$tableAlias}.value = in(?)", explode('_', Mage::app()->getRequest()->getParam($attribute->getAttributeCode())))

フィルター値を AND 方式で適用する必要がある場合、手順はもう少し複雑になります。基本的に、同じテーブルに対して複数の結合を実行し、結合ごとに一意のテーブル エイリアスを指定する必要があります。

   $connection = Mage::getSingleton('core/resource')->getConnection('core_read');
   $tableAlias = $attribute->getAttributeCode() . '_idx';

   $values = explode('_', Mage::app()->getRequest()->getParam($attribute->getAttributeCode()));

   foreach ($values as $value) {
        $tableAliasModified = $tableAlias.'_'.$value;
        $conditions = array(
            "{$tableAliasModified}.entity_id = e.entity_id",
            $connection->quoteInto("{$tableAliasModified}.attribute_id = ?",
            $attribute->getAttributeId()),
            $connection->quoteInto("{$tableAliasModified}.store_id = ?", Mage::app()->getStore()->getStoreId()),
                $connection->quoteInto("{$tableAliasModified}.value = ?", $value)
            );

        $productsCollection->getSelect()->join(
            array($tableAliasModified => Mage::getResourceModel('catalog/layer_filter_attribute')->getMainTable()),
            implode(' AND ', $conditions),
            array()
            );
    }
于 2013-02-22T16:15:21.017 に答える