Magento 具有自定义属性的分层导航

Magento 具有自定义属性的分层导航,magento,Magento,我们有一个分层导航(),允许用户按类别、价格和颜色进行过滤。类别和价格工作得很好,因为它们默认为Magento。当尝试按颜色(自定义属性)过滤时,会出现问题 它抛出一个异常。我能够追踪到堆栈跟踪,但我无法理解它。不知是否有人能帮我指出正确的方向。跟踪: 我们正在使用Magento Enterprise v1.12.0.2app/Mage/Catalog/Model/Resource/Layer/Filter/Attribute.php出现问题 用下面的内容替换你的类,it问题应该得到解决 cla

我们有一个分层导航(),允许用户按类别、价格和颜色进行过滤。类别和价格工作得很好,因为它们默认为Magento。当尝试按颜色(自定义属性)过滤时,会出现问题

它抛出一个异常。我能够追踪到堆栈跟踪,但我无法理解它。不知是否有人能帮我指出正确的方向。跟踪:


我们正在使用Magento Enterprise v1.12.0.2

app/Mage/Catalog/Model/Resource/Layer/Filter/Attribute.php出现问题

用下面的内容替换你的类,it问题应该得到解决

class Mage_Catalog_Model_Resource_Layer_Filter_Attribute extends Mage_Core_Model_Resource_Db_Abstract
{
/**
 * Initialize connection and define main table name
 *
 */
protected function _construct()
{
    $this->_init('catalog/product_index_eav', 'entity_id');
}

/**
 * Apply attribute filter to product collection
 *
 * @param Mage_Catalog_Model_Layer_Filter_Attribute $filter
 * @param int $value
 * @return Mage_Catalog_Model_Resource_Layer_Filter_Attribute
 */
public function applyFilterToCollection($filter, $value)
{

    $filterSingleton = FilterSingleton::singleton();

    if (!isset($filterSingleton->return)) {

        $collection = $filter->getLayer()->getProductCollection();
        $attribute  = $filter->getAttributeModel();
        $connection = $this->_getReadAdapter();
        $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)
        );

        $collection->getSelect()->join(
            array($tableAlias => $this->getMainTable()),
            join(' AND ', $conditions),
            array()
        );

        $filterSingleton->return = $this;

        return $this;

    } else {
        return $filterSingleton->return;
    }
}

/**
 * Retrieve array with products counts per attribute option
 *
 * @param Mage_Catalog_Model_Layer_Filter_Attribute $filter
 * @return array
 */
public function getCount($filter)
{
    // clone select from collection with filters
    $select = clone $filter->getLayer()->getProductCollection()->getSelect();
    // reset columns, order and limitation conditions
    $select->reset(Zend_Db_Select::COLUMNS);
    $select->reset(Zend_Db_Select::ORDER);
    $select->reset(Zend_Db_Select::LIMIT_COUNT);
    $select->reset(Zend_Db_Select::LIMIT_OFFSET);

    $connection = $this->_getReadAdapter();
    $attribute  = $filter->getAttributeModel();
    $tableAlias = sprintf('%s_idx', $attribute->getAttributeCode());
    $conditions = array(
        "{$tableAlias}.entity_id = e.entity_id",
        $connection->quoteInto("{$tableAlias}.attribute_id = ?", $attribute->getAttributeId()),
        $connection->quoteInto("{$tableAlias}.store_id = ?", $filter->getStoreId()),
    );

    $select
        ->join(
            array($tableAlias => $this->getMainTable()),
            join(' AND ', $conditions),
            array('value', 'count' => new Zend_Db_Expr("COUNT({$tableAlias}.entity_id)")))
        ->group("{$tableAlias}.value");

    return $connection->fetchPairs($select);
    }
}
class FilterSingleton {

static private $instance;

public $return = null;

    private function __construct() {

}

static public function singleton() {
     if (!isset(self::$instance)) {
        $c = __CLASS__;
        self::$instance = new $c;
    }

    return self::$instance;
}
}

您只需从布局中删除enterprisesearch块,例如下面的catalogsearch.xml:

    <catalogsearch_result_index translate="label">
    ...
        <reference name="left">
            <remove name="enterprisesearch.leftnav"/>
        </reference>
        <reference name="right">
            <block type="catalogsearch/layer" name="catalogsearch.rightnav" before="-" template="catalog/layer/view.phtml"/>
        </reference>
    ...
    </catalogsearch_result_index>

...
...

发生错误是因为它们的两个块在布局中执行相同的操作。默认情况下,企业搜索就在那里。

您能否简要描述一下您所做的更改及其原因?