Wie funktioniert die Sortierreihenfolge von Produkten in Unterkategorien?
Frage
Beim Hinzufügen eines Produkts zu einer Kategorie kann ein Sortierbestellwert angegeben werden.
Bildgebung jetzt haben wir eine Kategorie "P" auf "Anker" und verschiedene Kategorien "C1" und "C2", die Kinder von "P" sind.
Wie ist die Reihenfolge dieser Produkte definiert, die nur in den Unterkategorien enthalten sind, sondern beim Öffnen der übergeordneten Kategorie angezeigt werden?
Lösung
Sich ansehen Mage_Catalog_Model_Resource_Category_Indexer_Product::_refreshAnchorRelations
speziell diese Zeilen:
$position = 'MIN('.
$adapter->getCheckSql(
'cp.category_id = ce.entity_id',
'cp.position',
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
)
.')';
cc
und ce
sind gleich catalog_category_entity
Tisch und cp
ist catalog_category_product
Tisch.
Ein Produkt kann in mehr als einer Kinderkategorien stattfinden, sodass die Produktposition zwischen mehreren Werten ein Minimum liegt.
Grundsätzlich ist die Produktposition in der übergeordneten Kategorie das Minimum zwischen den Positionen relativ zu jeder Kategorien aus der Tabelle catalog_category_product
folgt dieser Formel:
(child category position + 1) * (child category level + 1) * 10000 + ( product position in catalog_category_product + 1)
BEARBEITEN
Schlussfolgerung: Produkte in einer Kategorie mit einer höheren Position im Baum werden vor den folgenden angezeigt.
Andere Tipps
Wie Marius und Andreas vorschlugen, müssen Sie die neu schreiben Mage_Catalog_Model_Resource_Category_Indexer_Product
Klasse, um die Komportierung von zu ändern _refreshAnchorRelations
und reindexAll
.
Zum _refreshAnchorRelations
Sie haben standardmäßig
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
Ändern Sie es für
'cp.position + 10000'
Zum reindexAll
Sie haben standardmäßig
'('.$idxAdapter->quoteIdentifier('ce.position').' + 1) * '
.'('.$idxAdapter->quoteIdentifier('ce.level').' + 1 * 10000)'
.' + '.$idxAdapter->quoteIdentifier('cp.position')
Ändern Sie es für
'('.$idxAdapter->quoteIdentifier('cp.position').' + 10000)'
Es wird also nur die Mindestproduktposition benötigen. Ich habe hinzugefügt + 10000
Weil einige unserer Kunden eine negative Position eingeben.