Come specificare un ordinamento personalizzato per la raccolta prodotti?


12

Sto cercando di creare una raccolta di prodotti in base alla matrice di ID prodotti e anche di ordinare la raccolta in base alla matrice di 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,
        ));

Voglio ordinare raccolti come appaiono $productIdsnell'array che è, 318, 310, 311ma sopra il codice restituirà l'ordinamento della raccolta come 310,311, 312.

È possibile senza utilizzare la semplice query MySQL come indicato di seguito?

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

Risposte:


18

Purtroppo Magento convaliderà le opzioni dell'ordine in Varien_Data_Collection_Db _setOrderfunzione. Ma puoi ottenere la selezione della raccolta e aggiungere una nuova espressione per costruire l'ordine come preferisci.

/* @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());
}

Qui dovresti vedere che gli ID del prodotto sono nell'ordine dell'array.


Funziona! Grazie. Possiamo combinare l'ordinamento per SKU in alto?
Tahir Yasin,

È possibile aggiungere più campi a questo ordine mediante la sintassiFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.