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

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

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

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

163272 次浏览

几乎所有 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'),
));

lib/Varien/Data/Collection/Db.php_getConditionSql方法中可以找到支持的短条件句(eq、 lt 等)的完整列表

最后,可以对所有 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());
}

这是继我最初的问题,以帮助其他人同样的问题。如果需要根据属性进行过滤,而不是手动查找 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;
}

我加了线

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

进去

App/code/core/Mage/Catalog/Block/Product/List.php 在第95行

在功能 _getProductCollection()

然后报警

App/design/front/default/hellopress/template/alog/product/list.phtml

通过编写代码

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

现在它在 Magento 1.4. x 中正常工作

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

谢谢 Anita Mourya

我发现有两种方法: 假设在后端添加名为“ na _ author”的 product 属性作为文本字段。

方法1

list.phtml频道

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

按库存计算每个产品的装载量,并获得产品内部属性

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


}

你会很高兴看到它... ! !

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

Create 属性名为“ price_screen_tab_name”。

<?php $_product = $this->getProduct(); ?>
<?php echo $_product->getData('price_screen_tab_name');?>