Как работает порядок сортировки продуктов в подкатегориях?
Вопрос
При добавлении продукта в категорию можно указать значение заказа сортировки.
Изображение теперь у нас есть категория «P», установленная для «якоря» и различных категорий «C1» и «C2», которые являются Childs «P».
Как определяется порядок этих продуктов, которые находятся только в категориях, но отображаются при открытии родительской категории?
Решение
Взгляни на Mage_Catalog_Model_Resource_Category_Indexer_Product::_refreshAnchorRelations
Особенно эти строки:
$position = 'MIN('.
$adapter->getCheckSql(
'cp.category_id = ce.entity_id',
'cp.position',
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
)
.')';
cc
а также ce
подобные catalog_category_entity
стол и cp
является catalog_category_product
стол.
Продукт может быть в более чем одной категориях ребенка, поэтому положение продукта минимальна между несколькими значениями.
Таким образом, в основном позиция продукта в родительской категории является минимумом между позициями относительно каждой категории из таблицы catalog_category_product
После этой формулы:
(child category position + 1) * (child category level + 1) * 10000 + ( product position in catalog_category_product + 1)
РЕДАКТИРОВАТЬ
Вывод: продукты в категории с положением выше в дереве будут показаны перед теми, которые ниже.
Другие советы
Как предложили Мариус и Андреас, вы должны переписать Mage_Catalog_Model_Resource_Category_Indexer_Product
класс, чтобы изменить компромисс _refreshAnchorRelations
а также reindexAll
.
За _refreshAnchorRelations
У вас есть по умолчанию
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
изменить это для
'cp.position + 10000'
За reindexAll
У вас есть по умолчанию
'('.$idxAdapter->quoteIdentifier('ce.position').' + 1) * '
.'('.$idxAdapter->quoteIdentifier('ce.level').' + 1 * 10000)'
.' + '.$idxAdapter->quoteIdentifier('cp.position')
изменить это для
'('.$idxAdapter->quoteIdentifier('cp.position').' + 10000)'
Так что это займет только минимальную позицию продукта. я добавил + 10000
Потому что некоторые из наших клиентов входят в негативную позицию.