Pregunta

Al agregar un producto a una categoría, se puede especificar un valor de orden de clasificación.

Imágenes ahora tenemos una categoría "P" establecida en "Anchor" y varias categorías "C1" y "C2" que son niños de "P".

¿Cómo se define el orden de esos productos, que solo están en las subcategorías, pero se muestran al abrir la categoría principal?

¿Fue útil?

Solución

Echa un vistazo a Mage_Catalog_Model_Resource_Category_Indexer_Product::_refreshAnchorRelations Especialmente estas líneas:

$position = 'MIN('.
            $adapter->getCheckSql(
                'cp.category_id = ce.entity_id',
                'cp.position',
                '(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
            )
        .')';

cc y ce son lo mismo catalog_category_entity mesa y cp es catalog_category_product mesa.

Un producto puede estar en más de una categorías de niños, por lo que la posición del producto es un mínimo entre múltiples valores.
Entonces, básicamente, la posición del producto en la categoría principal es el mínimo entre las posiciones en relación con cada categorías de la tabla catalog_category_product Siguiendo esta fórmula:

(child category position + 1) * (child category level + 1) * 10000 + ( product position in catalog_category_product + 1)  

EDITAR
Conclusión: los productos en una categoría con una posición más alta en el árbol se mostrarán antes de los siguientes.

Otros consejos

Como sugirieron Marius y Andreas, tienes que reescribir el Mage_Catalog_Model_Resource_Category_Indexer_Product clase para cambiar el emprendimiento de _refreshAnchorRelations y reindexAll.

Para _refreshAnchorRelations

Tienes por defecto

'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'

Cambiarlo para

'cp.position + 10000'

Para reindexAll

Tienes por defecto

'('.$idxAdapter->quoteIdentifier('ce.position').' + 1) * '
.'('.$idxAdapter->quoteIdentifier('ce.level').' + 1 * 10000)'
.' + '.$idxAdapter->quoteIdentifier('cp.position')

Cambiarlo para

'('.$idxAdapter->quoteIdentifier('cp.position').' + 10000)'

Por lo tanto, solo tomará la posición mínima del producto. Yo he añadido + 10000 Porque algunos de nuestros clientes entran en una posición negativa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top