Magento – 检索具有特定属性值的产品
在我的块代码中,我试图以编程方式检索具有特定值的属性的产品列表。
或者,如果这是不可能的,如何检索所有产品,然后过滤它们只列出具有特定属性的产品?
我将如何使用标准布尔filterAND
或OR
执行search以匹配我的产品子集?
几乎所有的Magento模型都有一个对应的Collection对象,可以用来获取Model的多个实例。
要实例化产品集合,请执行以下操作
$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');
有多种语法来设置集合上的filter。 我总是使用下面的详细的一个,但你可能想要检查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'), ));
在lib/Varien/Data/Collection/Db.php
中的_getConditionSql
方法中可以find支持的短条件(eq,lt等)的完整列表
最后,所有Magento集合都可以迭代(基本集合类实现迭代器接口)。 这是一旦设置了filter,您将如何抓住您的产品。
$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()); }
这是跟我原来的问题,以帮助其他同样的问题。 如果您需要按属性过滤,而不是手动查找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; }
这里有一个函数可以用来通过属性集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; }
$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>"; }
在产品列表页面上将TEXT
属性从admin添加到前端。
感谢Anita Mourya
我发现有两种方法。 假设从后端添加名为“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
通过添加如下粗体显示的两行来更改函数。
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; }
你会很高兴看到它….!
创build属性名称是“ price_screen_tab_name
”。 并使用这个简单的公式访问。
<?php $_product = $this->getProduct(); ?> <?php echo $_product->getData('price_screen_tab_name');?>
我已经添加了一行
$this->_productCollection->addAttributeToSelect('releasedate');
在
app / code / core / Mage / Catalog / Block / Product / List.php on line 95
在函数中_getProductCollection()
然后调用它
应用程序/devise/前端/默认/ hellopress /模板/目录/产品/ list.phtml
通过编写代码
<div><?php echo $this->__('Release Date: %s', $this->dateFormat($_product->getReleasedate())) ?> </div>
现在它在Magento 1.4.x中工作