Почти все модели Magento имеют соответствующий объект Collection, который можно использовать для извлечения нескольких экземпляров Модели.
Чтобы создать экземпляр коллекции продукта, выполните следующие действия
$collection = Mage::getModel('catalog/product')->getCollection();
продукты являются стиль модели Magento EAV, поэтому вам нужно добавить какие-либо дополнительные атрибуты, которые вы хотите, чтобы вернуться.
$collection = Mage::getModel('catalog/product')->getCollection();
//fetch name and orig_price into data
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
Существует множество синтаксисов для установки фильтров в коллекциях. Я всегда использую подробный ниже, но вы можете проверить источник Magento для дополнительных способов использования методов фильтрации.
Ниже показано, как фильтр по диапазону значений (больше и меньше, чем)
$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'),
));
В то время как это будет фильтровать по имени, которое равно одно или другой.
$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'),
));
Полный список поддерживаемого коротких условных (э, л, и т.д.) может быть найден в методе _getConditionSql
в lib/Varien/Data/Collection/Db.php
Наконец, все коллекции Magento могут быть итерациями (базовый класс коллекции реализует интерфейсы итератора). Вот как вы будете захватывать свои продукты после установки фильтров.
$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());
}
очень подробный ответ. благодаря! –
Большое спасибо за подробный ответ. Ты поставил меня на правильном пути. Я сделал var_dump результатов из вашего примера кода. Поскольку атрибут, с которым я работаю, является элементом множественного выбора, я получаю числовой идентификатор в результатах, поэтому сравнение текста не работает. НАПРИМЕР.$ this-> collection-> addFieldToFilter (array ( ) array ('attribute' => 'cw_category', 'eq' => 'Aero'), array ('attribute' => 'cw_category', 'eq' => 'Track'), array ('attribute' => 'cw_category', 'eq' => 'Touring') )); возвращается «cw_category» => строка», 536535534' (длина = 12) – Christian
Не могу конкретно помочь вам там не много рыть (StackOverflow респ это хорошо, но он не платит по счетам). Два пути для вас. Во-первых, как уже упоминалось, checkget _getConditionSql для списка всех возможных операторов сравнения. Возможно, вам удастся обойтись с подобным предложением или, может быть, с ним. Во-вторых, если вы проверите PHPDoc для метода addAttributeToFilter на Mage_Eav_Model_Entity_Collection_Abstract, вы увидите, что одним из ожидаемых значений первого параметра является Mage_Eav_Model_Entity_Attribute_Interface. Это может привести вас к правильному пути. –