Casi todos los modelos de Magento tienen un objeto de colección correspondiente que se puede usar para buscar varias instancias de un modelo.
para crear instancias de una colección de productos, haga lo siguiente
$collection = Mage::getModel('catalog/product')->getCollection();
los productos son un modelo de estilo Magento EAV, por lo que tendrá que añadir en cualquier atributo adicional que desea devolver.
$collection = Mage::getModel('catalog/product')->getCollection();
//fetch name and orig_price into data
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
Hay múltiples sintaxis para configurar los filtros en las colecciones. Siempre uso la detallada a continuación, pero es posible que desee inspeccionar la fuente de Magento para conocer las formas adicionales en que se pueden usar los métodos de filtrado.
A continuación se muestra cómo filtrar por un rango de valores (mayor que y menor que)
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
//filter for products whose orig_price is greater than (gt) 100
$collection->addFieldToFilter(array(
array('attribute'=>'orig_price','gt'=>'100'),
));
//AND filter for products whose orig_price is less than (lt) 130
$collection->addFieldToFilter(array(
array('attribute'=>'orig_price','lt'=>'130'),
));
Aunque esto va a filtrar por un nombre que es igual a una cosa u otra.
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
//filter for products who name is equal (eq) to Widget A, or equal (eq) to Widget B
$collection->addFieldToFilter(array(
array('attribute'=>'name','eq'=>'Widget A'),
array('attribute'=>'name','eq'=>'Widget B'),
));
Una lista completa de los condicionales cortas compatibles (eq, lt, etc.) se pueden encontrar en el método de _getConditionSql
en lib/Varien/Data/Collection/Db.php
Finalmente, todas las colecciones de Magento pueden repiten a lo largo (la clase de colección de base implementa en las interfaces del iterador). Así es como agarrarás tus productos una vez que se establezcan los filtros.
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
//filter for products who name is equal (eq) to Widget A, or equal (eq) to Widget B
$collection->addFieldToFilter(array(
array('name'=>'orig_price','eq'=>'Widget A'),
array('name'=>'orig_price','eq'=>'Widget B'),
));
foreach ($collection as $product) {
//var_dump($product);
var_dump($product->getData());
}
respuesta muy detallada. ¡Gracias! –
Muchas gracias por la respuesta detallada. Me has puesto en el camino correcto. Hice un var_dump de los resultados de su código de ejemplo. Debido a que el atributo con el que estoy trabajando es un elemento de selección múltiple, obtengo una identificación numérica en los resultados, por lo que una comparación de texto no funciona. P.EJ.$ this-> collection-> addFieldToFilter (array ( array ('atributo' => 'cw_category', 'eq' => 'Aero'), array ('atributo' => 'cw_category', 'eq' => 'Track'), array ('atributo' => 'cw_category', 'eq' => 'Touring') )); está volviendo 'cw_category' => string', 536535534' (longitud = 12) No se puede – Christian
específicamente para ayudarte allí sin un montón de excavación (Stackoverflow representante es agradable, pero no paga las facturas). Dos avenidas para que puedas perseguir. Primero, como se mencionó, revise _getConditionSql para obtener una lista de todos los posibles operadores de comparación. Es posible que pueda salir adelante con una cláusula similar o tal vez una entrada. En segundo lugar, si descarga PHPDoc para el método addAttributeToFilter en Mage_Eav_Model_Entity_Collection_Abstract, verá que uno de los valores esperados del primer parámetro es Mage_Eav_Model_Entity_Attribute_Interface. Eso podría llevarte en el camino correcto. –