Chr*_*ian 77 php magento e-commerce entity-attribute-value
在我的块代码中,我尝试以编程方式检索具有特定值属性的产品列表.
或者,如果不可能,那么如何检索所有产品然后过滤它们以仅列出具有特定属性的产品?
如何使用标准布尔过滤器执行搜索AND或OR匹配我的产品的子集?
Ala*_*orm 161
几乎所有Magento模型都有一个相应的Collection对象,可用于获取Model的多个实例.
要实例化Product集合,请执行以下操作
$collection = Mage::getModel('catalog/product')->getCollection();
Run Code Online (Sandbox Code Playgroud)
产品是Magento EAV样式模型,因此您需要添加要返回的任何其他属性.
$collection = Mage::getModel('catalog/product')->getCollection();
//fetch name and orig_price into data
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
Run Code Online (Sandbox Code Playgroud)
有多种语法可用于在集合上设置过滤器.我总是使用下面的详细信息,但您可能需要检查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'),
));
Run Code Online (Sandbox Code Playgroud)
虽然这将按名称等于一件事或另一件事过滤.
$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'),
));
Run Code Online (Sandbox Code Playgroud)
支持的短条件(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());
}
Run Code Online (Sandbox Code Playgroud)
这是我原来问题的一个跟进,以帮助其他人解决同样的问题.如果需要按属性进行过滤,而不是手动查找id,则可以使用以下代码检索属性的所有id,value对.数据作为数组返回,属性名称为键.
function getAttributeOptions($attributeName) {
$product = Mage::getModel('catalog/product');
$collection = Mage::getResourceModel('eav/entity_attribute_collection')
->setEntityTypeFilter($product->getResource()->getTypeId())
->addFieldToFilter('attribute_code', $attributeName);
$_attribute = $collection->getFirstItem()->setEntity($product->getResource());
$attribute_options = $_attribute->getSource()->getAllOptions(false);
foreach($attribute_options as $val) {
$attrList[$val['label']] = $val['value'];
}
return $attrList;
}
Run Code Online (Sandbox Code Playgroud)
这是一个可以用来通过属性集ID获取产品的函数.使用上一个功能检索.
function getProductsByAttributeSetId($attributeSetId) {
$products = Mage::getModel('catalog/product')->getCollection();
$products->addAttributeToFilter('attribute_set_id',$attributeSetId);
$products->addAttributeToSelect('*');
$products->load();
foreach($products as $val) {
$productsArray[] = $val->getData();
}
return $productsArray;
}
Run Code Online (Sandbox Code Playgroud)
$attribute = Mage::getModel('eav/entity_attribute')
->loadByCode('catalog_product', 'manufacturer');
$valuesCollection = Mage::getResourceModel('eav/entity_attribute_option_collection')
->setAttributeFilter($attribute->getData('attribute_id'))
->setStoreFilter(0, false);
$preparedManufacturers = array();
foreach($valuesCollection as $value) {
$preparedManufacturers[$value->getOptionId()] = $value->getValue();
}
if (count($preparedManufacturers)) {
echo "<h2>Manufacturers</h2><ul>";
foreach($preparedManufacturers as $optionId => $value) {
$products = Mage::getModel('catalog/product')->getCollection();
$products->addAttributeToSelect('manufacturer');
$products->addFieldToFilter(array(
array('attribute'=>'manufacturer', 'eq'=> $optionId,
));
echo "<li>" . $value . " - (" . $optionId . ") - (Products: ".count($products).")</li>";
}
echo "</ul>";
}
Run Code Online (Sandbox Code Playgroud)