Come funziona l'ordinamento dei prodotti nel lavoro sottocategorie?
Domanda
Quando si aggiunge un prodotto a una categoria, un valore di ordinamento può essere specificato.
Imaging ora abbiamo una Categoria "P" insieme a "Anchor" e varie categorie "C1" e "C2", che sono Childs di "P".
Come è l'ordine di quei prodotti definiti, che sono solo nelle categorie sub, ma visualizzata quando si apre categoria superiore?
Soluzione
Date un'occhiata a Mage_Catalog_Model_Resource_Category_Indexer_Product::_refreshAnchorRelations
specialmente queste righe:
$position = 'MIN('.
$adapter->getCheckSql(
'cp.category_id = ce.entity_id',
'cp.position',
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
)
.')';
cc
e ce
sono allo stesso tavolo catalog_category_entity
e cp
è tavolo catalog_category_product
.
Un prodotto può essere in più di un bambino categorie in modo che la posizione di prodotto è un minimo tra più valori.
Quindi, in pratica la posizione del prodotto nella categoria superiore è il minimo tra le posizioni relative a ciascun categorie dal catalog_category_product
tabella che segue questa formula:
(child category position + 1) * (child category level + 1) * 10000 + ( product position in catalog_category_product + 1)
[EDIT]
Conclusione:. Prodotti in una categoria con una posizione più alta nella struttura verranno visualizzati prima di quelli al di sotto
Altri suggerimenti
Per quanto Marius e Andreas hanno suggerito, è necessario riscrivere la classe Mage_Catalog_Model_Resource_Category_Indexer_Product
per cambiare il comportement di _refreshAnchorRelations
e reindexAll
.
Per _refreshAnchorRelations
Hai di default
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
cambiarlo per
'cp.position + 10000'
Per reindexAll
Hai di default
'('.$idxAdapter->quoteIdentifier('ce.position').' + 1) * '
.'('.$idxAdapter->quoteIdentifier('ce.level').' + 1 * 10000)'
.' + '.$idxAdapter->quoteIdentifier('cp.position')
cambiarlo per
'('.$idxAdapter->quoteIdentifier('cp.position').' + 10000)'
Quindi, ci vorrà solo la posizione del prodotto minimo. Ho aggiunto + 10000
perché alcuni dei nostri clienti immettere una posizione negativa.