Magento использует статические атрибуты в многоуровневой навигации

Мне интересно, кто-нибудь когда-либо реализовывал новый атрибут продукта, устанавливая его как тип STATIC и вводя визуализатор как SELECT. Область действия атрибута - ГЛОБАЛЬНАЯ.

В основном значение атрибута для каждого продукта будет сохранено в таблице основного объекта catalog_product_entity.

После этой настройки я сошел с ума от импорта продуктов. Все сработало правильно.

При посещении страниц категорий во внешнем интерфейсе этот настраиваемый атрибут не отображался в состоянии слоя и не отображался при многоуровневой навигации по категориям. Мне удалось решить эту проблему, изменив функции класса Mage_Catalog_Model_Resource_Layer_Filter_Attribute: applyFilterToCollection и getCount.

В настоящее время все работает правильно на интерфейс и админ.

Пожалуйста, дайте мне знать, если кто-то попробовал этот подход. Я могу поделиться своим кодом здесь просто дайте мне знать, если вы заинтересованы!

Код для добавления атрибута (используется внутри установщика):

$installer = $this;
/* @var $installer Mage_Core_Model_Resource_Setup */

$installer->startSetup();

$l_oEAVSetup                = new Mage_Eav_Model_Entity_Setup('eav_setup');
$l_aCatalogProductEntity    = $l_oEAVSetup->getEntityType('catalog_product');
$l_iProductEntityTypeId     = $l_aCatalogProductEntity['entity_type_id'];

$installer->run("

ALTER TABLE  {$this->getTable('catalog/product')} ADD  `game_genre` INT( 11 ) UNSIGNED NULL DEFAULT NULL ,
ADD INDEX (  `game_genre` );

");

$l_oEAVSetup->addAttribute($l_iProductEntityTypeId, 'game_genre', array(
    'group'                 => 'General',
    'input'                 => 'select',
    'label'                 => 'Genre',
    'required'              => true,
    'user_defined'          => false,
    'type'                  => 'static'
));
$installer->endSetup();

Измененный код из Mage_Catalog_Model_Resource_Layer_Filter_Attribute

public function applyFilterToCollection($filter, $value)
    {
        $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)
        );

        if ('static' === $attribute->getBackendType()) {            
            $collection->getSelect()->join(
                array($tableAlias => $this->getTable('catalog/product')),
                implode(' AND ', array(
                    $connection->quoteInto($tableAlias. '.'. $attribute->getAttributeCode(). ' = ?', $value),
                    $tableAlias. '.entity_id = e.entity_id'
                )),
                array()
            );

            //$select = $collection->getSelect();
            //$select->where('e.'. $attribute->getAttributeCode(). ' = ?', $value);         
        }
        else {

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

        return $this;
    }

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()),
        );

        if ('static' === $attribute->getBackendType()) {
            $select->columns('e.'. $attribute->getAttributeCode());
            $select->columns(array('count' => new Zend_Db_Expr('COUNT(e.entity_id)')));
            $select->group('e.'. $attribute->getAttributeCode());
        }
        else {

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

0 ответов

Другие вопросы по тегам