2009-08-26 4 views
76

В моем блочном коде я пытаюсь программно получить список продуктов, имеющих атрибут с определенным значением.Magento - Получить продукты с определенным значением атрибута

Альтернативно, если это невозможно, как можно получить все продукты, а затем фильтровать их, чтобы просто перечислять продукты с определенным атрибутом?

Как выполнить поиск с использованием стандартных булевых фильтров AND или OR в соответствии с подмножеством моих продуктов?

ответ

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 для дополнительных способов использования методов фильтрации.

Ниже показано, как фильтр по диапазону значений (больше и меньше, чем)

$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 в 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()); 
} 
+5

очень подробный ответ. благодаря! –

+0

Большое спасибо за подробный ответ. Ты поставил меня на правильном пути. Я сделал var_dump результатов из вашего примера кода. Поскольку атрибут, с которым я работаю, является элементом множественного выбора, я получаю числовой идентификатор в результатах, поэтому сравнение текста не работает. НАПРИМЕР.$ this-> collection-> addFieldToFilter (array ( ) array ('attribute' => 'cw_category', 'eq' => 'Aero'), array ('attribute' => 'cw_category', 'eq' => 'Track'), array ('attribute' => 'cw_category', 'eq' => 'Touring') )); возвращается «cw_category» => строка», 536535534' (длина = 12) – Christian

+0

Не могу конкретно помочь вам там не много рыть (StackOverflow респ это хорошо, но он не платит по счетам). Два пути для вас. Во-первых, как уже упоминалось, checkget _getConditionSql для списка всех возможных операторов сравнения. Возможно, вам удастся обойтись с подобным предложением или, может быть, с ним. Во-вторых, если вы проверите PHPDoc для метода addAttributeToFilter на Mage_Eav_Model_Entity_Collection_Abstract, вы увидите, что одним из ожидаемых значений первого параметра является Mage_Eav_Model_Entity_Attribute_Interface. Это может привести вас к правильному пути. –

7

Это мой первоначальный вопрос, чтобы помочь другим людям с той же проблемой. Если вам нужно фильтровать по атрибуту, а не вручную искать идентификатор, вы можете использовать следующий код для извлечения всех пар 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; 
} 
0

Я добавил линию

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

в

приложения/код/​​ядро ​​/ Mage/Каталог/блока/продукта/список.PHP на линии 95

в функции _getProductCollection()

, а затем вызвать его в

приложение/дизайн/интерфейс/по умолчанию/hellopress/шаблон/Каталог/продукта/list.phtml

путем написания кода

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

Теперь он работает в Magento 1.4.x

3

Получить TEXT атрибутов, добавленных от администратора до лицевой части на странице со списком товаров.

Благодаря Анита Mourya

Я нашел там два метода. Пусть, например, атрибут product, называемый «na_author», добавляется из бэкэнд в виде текстового поля.

МЕТОД 1

на list.phtml

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

ДЛЯ КАЖДОЙ НАГРУЗКИ ПРОДУКТОВ ПО SKU И ПОЛУЧИТЬ ATTRIBUTE ВНУТРИ 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 НАД 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; 

} 

и вы будете рады его увидеть .... !!

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

создать атрибут name is "price_screen_tab_name". и доступ с использованием этой простой формулы.

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