首页 文章

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

提问于
浏览
0

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

它引发了一个例外 . 我能够追踪堆栈跟踪,但我无法理解它 . 想知道是否有人可以帮我指出正确的方向 . 追踪:https://gist.github.com/4490917

我们正在使用Magento Enterprise v1.12.0.2

2 回答

  • 0

    app/Mage/Catalog/Model/Resource/Layer/Filter/Attribute.php 存在问题

    用以下内容换掉你的课程,应该解决它的问题 .

    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;
    }
    }
    

    http://aceph.tumblr.com/post/21851233473/magento-you-cannot-define-a-correlation-name

  • 1

    您只需从布局中删除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>
    

    发生错误是因为它们是两个块在布局中做同样的事情 . 默认情况下,企业搜索是存在的 .

相关问题