Wie kann ich eine benutzerdefinierte Sortierreihenfolge für die Produktabholung festlegen?

12

Ich versuche, eine Produktsammlung basierend auf einem Array von Produkt-IDs zu erstellen und die Sammlung auch basierend auf dem Array von IDs zu sortieren.

$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,
        ));

Ich möchte gesammelt sortieren, wie sie im $productIdsArray angezeigt werden, 318, 310, 311aber der obige Code gibt eine Sammlungssortierung wie zurück 310,311, 312.

Ist dies möglich, ohne eine einfache MySQL-Abfrage wie unten angegeben zu verwenden?

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

Antworten:

18

Leider wird Magento die Bestelloptionen in Varien_Data_Collection_Db _setOrderFunktion validieren . Sie können jedoch die Auswahl der Sammlung treffen und einen neuen Ausdruck hinzufügen, um die Reihenfolge nach Ihren Wünschen zu erstellen.

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

Hier sollten Sie sehen, dass sich die Produkt-IDs in der Reihenfolge des Arrays befinden.

David Manners
quelle
Es klappt! Vielen Dank. Können wir die Sortierung nach Artikelnummer bis oben kombinieren?
Tahir Yasin
Sie können durch die Syntax mehrere Felder zu dieser Bestellung hinzufügenFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners