Magento-получение продуктов с определенным значением атрибута
в моем блоке кода я пытаюсь программно получить список продуктов, которые имеют атрибут с определенным значением.
альтернативно, если это невозможно, как можно получить все продукты, а затем отфильтровать их, чтобы просто перечислить продукты с определенным атрибутом?
Как бы я выполнил поиск с использованием стандартных логических фильтров AND
или OR
чтобы соответствовать подмножеству моих продуктов?
6 ответов:
почти все модели Magento имеют соответствующий объект коллекции, который может быть использован для извлечения нескольких экземпляров модели.
чтобы создать экземпляр коллекции продуктов, выполните следующие действия
$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 на наличие дополнительных способов использования методов фильтрации.
ниже показано, как фильтровать по диапазону значений (больше и меньше)
$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'), ));
полный список поддерживаемых коротких условных обозначений (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('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, 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; }
вот функция, которую вы можете использовать, чтобы получить продукты по их идентификатору набора атрибутов. Полученные с помощью предыдущей функции.
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
атрибуты добавлены от администратора к интерфейсу на странице списка продуктов.Спасибо Анита Mourya Прямая Трансляция
я обнаружил, что есть два метода. Допустим, атрибут продукта под названием "na_author" добавляется из бэкэнда в виде текстового поля.
метод 1
on
list.phtml
<?php $i=0; foreach ($_productCollection as $_product): ?>
ДЛЯ КАЖДОЙ ЗАГРУЗКИ ПРОДУКТА SKU И ПОЛУЧИТЬ АТРИБУТ ВНУТРИ FOREACH
<?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
над поездкой и установить в ' local папка'т. е. Копия С
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; }
и вы будете рады видеть его....!!
имя атрибута create -"
price_screen_tab_name
". и открыть с помощью этой простой формулы.<?php $_product = $this->getProduct(); ?> <?php echo $_product->getData('price_screen_tab_name');?>
я добавил строку
$this->_productCollection->addAttributeToSelect('releasedate');
на
приложение/код/ядро/маг/каталог/блок/продукт / список.php on line 95
функции
_getProductCollection()
а потом позвоните в
приложения/дизайн/фронтэнда/по умолчанию/hellopress/шаблон/каталог/продукта/список.phtml
написать код
<div><?php echo $this->__('Release Date: %s', $this->dateFormat($_product->getReleasedate())) ?> </div>
сейчас он работает в Magento 1.4.x