2010-10-21 11 views
5

He desarrollado un motor de búsqueda personalizado para nuestra tienda Magento y estoy tratando de cargar la colección de productos en un orden muy específico (he clasificado los resultados según un algoritmo que diseñé) .Magento obtener una colección de productos en un orden arbitrario

puedo cargar la colección producto correctamente, sin embargo, no está en el orden que me gusta estar aquí es básicamente la forma en que está trabajando ahora:.

Mi consulta de base de datos, básicamente, vuelve con un PHP matriz de ID de productos. Para este ejemplo vamos a decir que se parece a esto:

$entity_ids = array(140452, 38601); 

Ahora puede transponer el 140452 y el 38601 y la colección producto viene de nuevo en el mismo orden cada vez. Me gustaría que la colección de productos esté en el mismo orden que la ID de los ID de la entidad.

El código que estoy utilizando para crear mi colección es el siguiente:

$products = Mage::getModel('catalog/product') 
    ->getCollection() 
    ->addAttributeToSelect('*') 
    ->addAttributeToFilter('entity_id', array('in' => $entity_ids)) 
    ->setPageSize($results_per_page) 
    ->setCurPage($current_page) 
    ->load(); 

¿Hay una manera de establecer el orden de clasificación a estar a la orden del array $ entity_ids?

Respuesta

13

Colecciones heredan de la clase

Varien_Data_Collection_Db 

Hay un método denominado addOrder en dicha clase.

public function addOrder($field, $direction = self::SORT_ORDER_DESC) 
{ 
    return $this->_setOrder($field, $direction); 
} 

Por lo tanto, se podría pensar algo como esto debería funcionar para la referencia básica

Mage::getModel('catalog/product') 
->getCollection() 
->addAttributeToSelect('*') 
->addOrder('entity_id'); 

Sin embargo, no lo hace. Debido a la compleja que unen involucrados en las colecciones EAV, hay un método especial que se utiliza para añadir un atributo a la cláusula de orden

Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection::addAttributeToSort 

Sin embargo una vez más, esto sólo se puede utilizar para añadir atributos simples. Para crear una clasificación arbitraria, deberá manipular el objeto Zend_Select directamente. No soy un gran admirador de esto, y no soy un gran fan de usar funciones personalizadas de mysql para lograr cosas, pero parece que es la única forma de hacerlo

Probé el siguiente código en una instalación común y obtuve los resultados deseados. Debería poder usarlo para obtener lo que quiere.

 $ids = array(16,18,17,19); 
     $products = Mage::getModel('catalog/product')->getCollection() 
     ->addAttributeToSelect('*') 
     ->addAttributeToFilter('entity_id',$ids);   

        //shakes fist at PDO's array parameter 
        $ids = array_map('intval', $ids); 
     $products->getSelect()->order("find_in_set(e.entity_id,'".implode(',',$ids)."')"); 
     foreach($products as $product) 
     { 
      var_dump($product->getEntityId()); 
      var_dump($product->getSku()); 
     } 
+0

que pueden haber leído mal la pregunta, pero creo que quiere a la orden de la matriz que tiene actualmente en PHP (que no necesariamente se correlaciona a cualquier columna en el DB). Esto debería darle clasificación por cualquier columna, pero tendría que volver a poner los datos en la base de datos. –

+0

Ah, sí, he leído mal la pregunta. SO Burnout, creo. –

+1

Pregunta actualizada con más respuesta correcta. –

1

No hay manera de ordenar arbitrariamente en SQL por lo que tendría que ordenar los resultados en PHP después. Entonces, el problema más grande es que está utilizando el tamaño de página para limitar el número de resultados que se devuelven, algunos de los registros que desea podrían no ser devueltos debido a esto.

La mejor solución es agregar un atributo a los productos que luego puede usar para ordenar. Los productos en las categorías ya tienen un valor de 'posición' que se usa de esta manera. Entonces solo necesita usar el método addOrder() addAttributeToSort() que Alan sugirió pero con su atributo personalizado.

(La explicación es apresurado, que me haga saber si no es lo suficientemente clara)

+0

Un par de cosas. 1. Parece que addOrder no funciona en las colecciones de EAV, necesita agregarAtributoToSort 2. Por lo general, puede obtener géneros arbitrarios en SQL usando lo que sea que esa función de implementación sea "find_in_set". Usar posición es probablemente una idea inteligente, si corresponde. –

+0

Gracias por la corrección. – clockworkgeek

Cuestiones relacionadas