カテゴリを選択するときに表示されるエラーは、フィルター オブジェクトが 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()
);
}