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


78

在我的阻止代码中,我试图以编程方式检索具有特定值属性的产品列表。

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

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

Answers:


160

几乎所有的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源,以了解使用过滤方法的其他方式。

下面显示了如何按一定范围的值(大于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'),        
));

可以在中的_getConditionSql方法中找到支持的简短条件(eq,lt等)的完整列表。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());
}

非常感谢您提供详细的答案。你让我走了正确的路。我对您的示例代码的结果做了var_dump。因为我正在使用的属性是一个多选项目,所以我在结果中得到一个数字ID,因此文本比较不起作用。EG $ this-> collection-> addFieldToFilter(array(array(array('attribute'=>'cw_category','eq'=>'Aero'),array('attribute'=>'cw_category','eq'=>' Track'),array('attribute'=>'cw_category','eq'=>'Touring')))); 返回'cw_category'=>字符串',536,535,534'(长度= 12)
Christian

在没有大量挖掘的情况下无法专门为您提供帮助(StackOverflow代表很好,但它不付账单)。您可以采用两种途径。首先,如上所述,请检出_getConditionSql以获取所有可能的比较运算符的列表。您可能可以使用like子句或in来获得。其次,如果您在Mage_Eav_Model_Entity_Collection_Abstract上签出了PHPDoc的addAttributeToFilter方法,您将看到第一个参数的期望值之一是Mage_Eav_Model_Entity_Attribute_Interface。这可能会引导您走上正确的道路。
艾伦·斯托姆

1
在最终的代码示例中,您的数组以'name' => 'orig_price'-正确吗?不是'attribute' => 'name'吗?
安迪

1
@johnsnails很有可能,此职位9岁。我的答案可能包含不正确的信息,或者API可能已从下面更改了。这些天我无法做足够的Magento工作来确定。
艾伦·斯托姆

1
@AlanStorm看来这只是您答案中另一个代码示例的复制/粘贴错误。我将编辑答案并进行更正。
安迪

7

这是我最初提出的问题的后续措施,旨在帮助其他遇到相同问题的人。如果您需要按属性过滤,而不是手动查找id,则可以使用以下代码检索属性的所有id,值对。以属性名称为键的数组形式返回数据。

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;
}

您可以使用此函数通过产品的属性集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;
}

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>";
}

3

要获取TEXT从管理员添加到产品列表页面前端的属性。

谢谢安妮塔·穆里亚

我发现有两种方法。假设从后端添加了称为“ na_author”的产品属性作为文本字段。

方法1

list.phtml

<?php $i=0; foreach ($_productCollection as $_product): ?>

通过SKU进行每种产品加载,并获取内部属性

<?php
$product = Mage::getModel('catalog/product')->loadByAttribute('sku',$_product->getSku());
$author = $product['na_author'];
?>

<?php
if($author!=""){echo "<br /><span class='home_book_author'>By ".$author ."</span>";} else{echo "";}
?>

方法2

Mage/Catalog/Block/Product/List.phtml OVER RIDE并设置在“本地文件夹”中

即复制自

Mage/Catalog/Block/Product/List.phtml

和粘贴到

app/code/local/Mage/Catalog/Block/Product/List.phtml

通过添加下面以粗体显示的2行来更改功能。

protected function _getProductCollection()
{
       if (is_null($this->_productCollection)) {
           $layer = Mage::getSingleton('catalog/layer');
           /* @var $layer Mage_Catalog_Model_Layer */
           if ($this->getShowRootCategory()) {
               $this->setCategoryId(Mage::app()->getStore()->getRootCategoryId());
           }

           // if this is a product view page
           if (Mage::registry('product')) {
               // get collection of categories this product is associated with
               $categories = Mage::registry('product')->getCategoryCollection()
                   ->setPage(1, 1)
                   ->load();
               // if the product is associated with any category
               if ($categories->count()) {
                   // show products from this category
                   $this->setCategoryId(current($categories->getIterator()));
               }
           }

           $origCategory = null;
           if ($this->getCategoryId()) {
               $category = Mage::getModel('catalog/category')->load($this->getCategoryId());

               if ($category->getId()) {
                   $origCategory = $layer->getCurrentCategory();
                   $layer->setCurrentCategory($category);
               }
           }
           $this->_productCollection = $layer->getProductCollection();

           $this->prepareSortableFieldsByCategory($layer->getCurrentCategory());

           if ($origCategory) {
               $layer->setCurrentCategory($origCategory);
           }
       }
       **//CMI-PK added na_author to filter on product listing page//
       $this->_productCollection->addAttributeToSelect('na_author');**
       return $this->_productCollection;

}

然后您将很高兴看到它。



0

我加了线

$this->_productCollection->addAttributeToSelect('releasedate');

第95行的app / code / core / Mage / Catalog / Block / Product / List.php

在功能上 _getProductCollection()

然后打电话给

app / design / frontend / default / hellopress / template / catalog / product / list.phtml

通过编写代码

<div><?php echo $this->__('Release Date: %s', $this->dateFormat($_product->getReleasedate())) ?>
</div>

现在可以在Magento 1.4.x中使用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.