Presque tous les modèles Magento possèdent un objet Collection correspondant qui peut être utilisé pour extraire plusieurs instances d'un modèle.
Pour instancier une collection de produits, procédez comme suit
$collection = Mage::getModel('catalog/product')->getCollection();
produits sont un modèle de style Magento EAV, vous aurez donc besoin d'ajouter des attributs supplémentaires que vous souhaitez revenir.
$collection = Mage::getModel('catalog/product')->getCollection();
//fetch name and orig_price into data
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
Il existe plusieurs syntaxes pour définir des filtres sur des collections. J'utilise toujours le verbose ci-dessous, mais vous voudrez peut-être inspecter la source Magento pour d'autres façons d'utiliser les méthodes de filtrage.
Ce qui suit montre comment filtrer par une plage de valeurs (supérieure et inférieure)
$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'),
));
Bien que cela filtrera par un nom qui correspond à une chose ou une autre.
$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'),
));
Une liste complète des courts conditionals pris en charge (éq, lt, etc.) se trouvent dans la méthode _getConditionSql
dans lib/Varien/Data/Collection/Db.php
Enfin, toutes les collections Magento peuvent être réitérées sur (la classe de collection de base implémente l'une des interfaces de l'itérateur). C'est ainsi que vous récupérerez vos produits une fois les filtres définis.
$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());
}
réponse très détaillée. Merci! –
Merci beaucoup pour la réponse détaillée. Tu m'as mis sur le bon chemin. J'ai fait un var_dump des résultats de votre exemple de code. Étant donné que l'attribut avec lequel je travaille est un élément de sélection multiple, j'obtiens un identifiant numérique dans les résultats afin qu'une comparaison de texte ne fonctionne pas. PAR EXEMPLE.$ this-> collection-> addFieldToFilter (array ('attribute' => 'cw_category', 'eq' => 'Aero'), array ('attribute' => 'cw_category', 'eq' => 'Track'), array ('attribute' => 'cw_category', 'eq' => 'Touring') )); EXPEDITEUR « cw_category » => string », 536535534' (longueur = 12) – Christian
Ne peut pas vous aider spécifiquement là-bas sans beaucoup de creuser (représentant StackOverflow est agréable, mais il ne paie pas les factures). Deux avenues à poursuivre. Tout d'abord, comme mentionné, checkout _getConditionSql pour une liste de tous les opérateurs de comparaison possibles. Vous pourriez être en mesure de vous débrouiller avec une clause like ou une entrée. Deuxièmement, si vous extrayez PHPDoc pour la méthode addAttributeToFilter sur Mage_Eav_Model_Entity_Collection_Abstract, vous verrez que l'une des valeurs attendues du premier param est Mage_Eav_Model_Entity_Attribute_Interface. Cela pourrait vous conduire sur le bon chemin. –