Comment spécifier un ordre de tri personnalisé pour la collection de produits?

12

J'essaie de créer une collection de produits basée sur un tableau d'ID de produits et de trier également la collection en fonction du tableau d'ID.

$productIds = array(318,310,311);
$collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->setOrder('entity_id', 'asc') // This will not do the job
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('entity_id', array(
    'in' => $productIds,
        ));

Je veux trier les éléments collectés tels qu'ils apparaissent dans le $productIdstableau, 318, 310, 311mais le code ci-dessus renverra le tri de la collection comme 310,311, 312.

Est-ce possible sans utiliser une simple requête MySQL comme indiqué ci-dessous?

SELECT *
FROM catalog_product_entity
WHERE entity_id IN (318,
                    310,
                    311)
ORDER BY FIELD(entity_id, 318, 310, 311);
Tahir Yasin
la source

Réponses:

18

Malheureusement, Magento validera les options de commande en Varien_Data_Collection_Db _setOrderfonction. Mais vous pouvez obtenir la sélection de la collection et ajouter une nouvelle expression pour construire la commande comme vous le souhaitez.

/* @var $collection Mage_Catalog_Model_Resource_Product_Collection */
$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('status', 1)
    ->addAttributeToFilter('entity_id', array(
            'in' => $productIds,
        ));

$collection->getSelect()->order(new Zend_Db_Expr('FIELD(e.entity_id, ' . implode(',', $productIds).')'));

foreach($collection as $product) {
    var_dump($product->getId());
}

Ici, vous devez voir que les identifiants des produits sont dans l'ordre du tableau.

David Manners
la source
Ça marche! Je vous remercie. Pouvons-nous combiner le tri par SKU ci-dessus?
Tahir Yasin
Vous pouvez ajouter plusieurs champs à cet ordre par la syntaxeFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners