В моем блочном коде я пытаюсь программно получить список продуктов, имеющих атрибут с определенным значением.
Альтернативно, если это невозможно, как можно получить все продукты, а затем фильтровать их, чтобы просто перечислять продукты с определенным атрибутом?
Как выполнить поиск, используя стандартные логические фильтры AND
или OR
чтобы соответствовать подмножеству моих продуктов?
Почти все модели 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 для дополнительных способов использования методов фильтрации.
Ниже показано, как фильтровать диапазон значений (больше И меньше)
$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
добавленные от администратора до конца на странице списка продуктов.
Спасибо Анита Моурья
Я нашел два метода. Пусть, например, атрибут product, называемый «na_author», добавляется из бэкэнд в виде текстового поля.
МЕТОД 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 и установите в 'local folder'
т.е. Копировать из
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; }
-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; }
и вы будете счастливы видеть это …. !!
создать имя атрибута – « price_screen_tab_name
». и доступ с использованием этой простой формулы.
<?php $_product = $this->getProduct(); ?> <?php echo $_product->getData('price_screen_tab_name');?>
Я добавил строку
$this->_productCollection->addAttributeToSelect('releasedate');
в
app / code / core / Маг / Каталог / Блок / Продукт / Список.php в строке 95
в функции _getProductCollection()
и затем назовите его
приложение / дизайн / интерфейс / по умолчанию / hellopress / шаблон / Каталог / продукта / list.phtml
Написав код
<div><?php echo $this->__('Release Date: %s', $this->dateFormat($_product->getReleasedate())) ?> </div>
Теперь он работает в Magento 1.4.x