Magento - Отримуйте товари з певним значенням атрибута


78

У своєму блоковому коді я намагаюся програмно отримати список продуктів, що мають атрибут із певним значенням.

Або, якщо це неможливо, як отримати всі товари, а потім відфільтрувати їх, щоб просто перерахувати товари з певним атрибутом?

Як мені виконати пошук за допомогою стандартних булевих фільтрів ANDабо ORзбіг підгрупи моїх продуктів?

Відповіді:


160

Майже всі моделі Magento мають відповідний об'єкт Collection, який можна використовувати для отримання декількох екземплярів Моделі.

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

Далі показано, як фільтрувати за діапазоном значень (більше І менше ніж)

$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('attribute'=>'name','eq'=>'Widget A'),
    array('attribute'=>'name','eq'=>'Widget B'),        
));

foreach ($collection as $product) {
    //var_dump($product);
    var_dump($product->getData());
}

Щиро дякую за детальну відповідь. Ви поставили мене на правильний шлях. Я зробив var_dump результатів з вашого прикладу коду. Оскільки атрибут, з яким я працюю, є елементом декількох виділень, я отримую числовий ідентифікатор у результатах, тому порівняння тексту не працює. EG $ this-> collection-> addFieldToFilter (array (array ('attribute' => 'cw_category', 'eq' => 'Aero'), array ('attribute' => 'cw_category', 'eq' => ' Трек '), масив (' attribute '=>' cw_category ',' eq '=>' Touring '))); Повертається 'cw_category' => рядок ', 536 535 534' (довжина = 12)
Крістіан

Не можу конкретно допомогти вам там без великих копань (StackOverflow представник приємний, але він не оплачує рахунки). Два шляхи для вас. По-перше, як уже згадувалося, перевірте _getConditionSql для переліку всіх можливих операторів порівняння. Можливо, ви зможете обійтись пропозицією like або, можливо, дюймом. По-друге, якщо ви перевірите PHPDoc на метод addAttributeToFilter на Mage_Eav_Model_Entity_Collection_Abstract, ви побачите, що одним із очікуваних значень першого параметра є Mage_Eav_Model_ribute_Antrite_Anticle_Anticle_Anticle_Anticle_Entity_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Anthell_Entity_Anthell_Anthell_Entity_Anticle_Entity. Це може привести вас на правильний шлях.
Алан Сторм,

1
В остаточному зразку коду ваші масиви починаються з 'name' => 'orig_price'- це правильно? Чи не повинно бути 'attribute' => 'name'?
Енді,

1
@johnsnails це дуже можливо, цей пост у 9 років. Моя відповідь могла містити недостовірну інформацію або API, можливо, змінився з-під неї. У наші дні я недостатньо працюю в Magento, щоб точно знати.
Алан Сторм,

1
@AlanStorm Схоже, це була просто помилка копіювання / вставлення з іншого зразка коду у вашій відповіді. Я збираюся відредагувати відповідь і виправити її.
Енді,

7

Це продовження мого оригінального запитання, щоб допомогти іншим з такою ж проблемою. Якщо вам потрібно відфільтрувати за атрибутом, замість того, щоб шукати ідентифікатор вручну, ви можете використовувати наступний код для отримання всіх ідентифікаторів, пар значень для атрибута. Дані повертаються як масив з ключем імені атрибута.

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

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

3

Щоб отримати TEXTатрибути, додані від адміністратора до інтерфейсу на сторінці списку товарів.

Дякую Аніта Мурія

Я виявив, що існує два методи. Скажімо, атрибут продукту під назвою "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 та встановлений у `` локальній папці ''

тобто скопіювати з

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;

}

і ти будеш радий це бачити .... !!


2

створити ім'я атрибута " price_screen_tab_name". і отримати доступ за допомогою цієї простої формули.

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

0

Я додав рядок

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

в

app / code / core / Mage / Catalog / Block / Product / List.php у рядку 95

у функції _getProductCollection()

а потім зателефонуйте

app / design / frontend / default / hellopress / template / catalog / product / list.phtml

Написавши код

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

Зараз це працює в Magento 1.4.x

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.