Comment l'ordre de tri des produits dans le travail sous-catégories?
Question
Lors de l'ajout d'un produit à une catégorie, une valeur de l'ordre de tri peut être spécifié.
Imaging maintenant nous avons une catégorie "P" sur "Anchor" et diverses catégories "C1" et "C2" qui sont Childs de "P".
Comment est l'ordre de ces produits définis, qui ne sont que dans les sous-catégories, mais affiché lors de l'ouverture de la catégorie parente?
La solution
Jetez un oeil à Mage_Catalog_Model_Resource_Category_Indexer_Product::_refreshAnchorRelations
spécialement ces lignes:
$position = 'MIN('.
$adapter->getCheckSql(
'cp.category_id = ce.entity_id',
'cp.position',
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
)
.')';
cc
et ce
sont la même table de catalog_category_entity
et cp
est table catalog_category_product
.
Un produit peut être dans plus d'une catégorie d'enfants si la position du produit est un minimum entre plusieurs valeurs.
Donc, fondamentalement, la position du produit dans la catégorie parente est le minimum entre les positions par rapport à chacune des catégories de la table catalog_category_product
suivant cette formule:
(child category position + 1) * (child category level + 1) * 10000 + ( product position in catalog_category_product + 1)
[EDIT] Conclusion:. Produits dans une catégorie avec une position plus élevée dans l'arbre seront affichés avant ceux ci-dessous
Autres conseils
Comme Marius et Andreas ont suggéré, vous devez réécrire la classe Mage_Catalog_Model_Resource_Category_Indexer_Product
pour changer le comportement de _refreshAnchorRelations
et reindexAll
.
Pour _refreshAnchorRelations
Vous avez par défaut
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
changer pour
'cp.position + 10000'
Pour reindexAll
Vous avez par défaut
'('.$idxAdapter->quoteIdentifier('ce.position').' + 1) * '
.'('.$idxAdapter->quoteIdentifier('ce.level').' + 1 * 10000)'
.' + '.$idxAdapter->quoteIdentifier('cp.position')
changer pour
'('.$idxAdapter->quoteIdentifier('cp.position').' + 10000)'
Il ne prendra que la position du produit minimum. J'ai ajouté + 10000
parce que certains de nos clients entrent dans une position négative.