前言:
在我的块代码中,我尝试以编程方式检索具有特定值属性的产品列表。
或者,如果不可能,那么如何检索所有产品然后过滤它们以仅列出具有特定属性的产品?
如何使用标准布尔过滤器执行搜索AND
或OR
匹配我的产品的子集?
几乎所有Magento模型都有一个相应的Collection对象,可用于获取Model的多个实例。
要实例化Product集合,请执行以下操作
$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源以获取可以使用过滤方法的其他方法。
以下显示如何按一系列值(大于AND小于)进行过滤
$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'),
));
支持的短条件(eq,lt等)的完整列表可以在_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('attribute'=>'name','eq'=>'Widget A'),
array('attribute'=>'name','eq'=>'Widget B'),
));
foreach ($collection as $product) {
//var_dump($product);
var_dump($product->getData());
}