Prawie wszystkie modele Magento mają odpowiedni obiekt Collection, który może służyć do pobierania wielu wystąpień modelu.
Aby instancji kolekcji produktu, wykonaj następujące czynności
$collection = Mage::getModel('catalog/product')->getCollection();
produkty są Magento EAV stylu modelu, więc trzeba dodać na wszelkich dodatkowych atrybutów, które chcesz przywrócić.
$collection = Mage::getModel('catalog/product')->getCollection();
//fetch name and orig_price into data
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
Istnieje wiele składni do ustawiania filtrów w kolekcjach. Zawsze używam poniższego, ale możesz chcieć sprawdzić źródło Magento, aby dowiedzieć się więcej o metodach filtrowania.
Poniżej przedstawiono, jak filtrować według zakresu wartości (większy i mniejszy niż)
$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'),
));
ile to będzie filtrować według nazwy, która wynosi jedną rzecz lub innego.
$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'),
));
Pełną listę obsługiwanych krótkich warunkowych (równanie, LT, itd.) Można znaleźć w sposobie _getConditionSql
w lib/Varien/Data/Collection/Db.php
Ostatecznie wszystkie zbiory Magento może być powtarzana przez (The klasy gromadzenia baza implementuje interfejs iteratora). W ten sposób pobierzesz swoje produkty po ustawieniu filtrów.
$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());
}
bardzo szczegółowa odpowiedź. dzięki! –
Dziękuję bardzo za szczegółową odpowiedź. Ustawiłeś mnie na właściwej ścieżce. Zrobiłem var_dump wyników z twojego przykładowego kodu. Ponieważ atrybut, nad którym pracuję jest elementem wielokrotnego wyboru, otrzymuję numer identyfikacyjny w wynikach, więc porównanie tekstu nie działa. NA PRZYKŁAD.$ this-> collection-> addFieldToFilter (array ( array ('atrybut' => 'cw_category', 'eq' => 'Aero'), array ('atrybut' => 'cw_category', 'eq' => 'Track'), array ('atrybut' => 'cw_category', 'eq' => 'Touring') )); Powraca 'cw_category' => ciąg ', 536,535,534' (długość = 12) – Christian
Nie może ci tam pomóc bez kopania (replikacja StackOverflow jest przyjemna, ale nie opłaca rachunków). Dwie drogi do realizacji. Najpierw, jak już wspomniano, kasa _getConditionSql dla listy wszystkich możliwych operatorów porównania. Być może uda ci się ominąć klauzulę lub wtyczkę. Po drugie, jeśli wyewidencjonujesz PHPDoc dla metody addAttributeToFilter na Mage_Eav_Model_Entity_Collection_Abstract, zobaczysz, że jedną z oczekiwanych wartości pierwszego parametru jest Mage_Eav_Model_Entity_Attribute_Interface. To może doprowadzić cię do właściwej ścieżki. –