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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top