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