Magento - 检索具有特定属性值的产品

Chr*_*ian 77 php magento e-commerce entity-attribute-value

在我的块代码中,我尝试以编程方式检索具有特定值属性的产品列表.

或者,如果不可能,那么如何检索所有产品然后过滤它们以仅列出具有特定属性的产品?

如何使用标准布尔过滤器执行搜索ANDOR匹配我的产品的子集?

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)


Chr*_*ian 7

这是我原来问题的一个跟进,以帮助其他人解决同样的问题.如果需要按属性进行过滤,而不是手动查找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)


ver*_*esj 5

$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)