Magento - Получите продукты с определенным значением атрибута

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

77
задан Cœur 30 December 2018 в 10:39
поделиться

3 ответа

Почти все модели 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());
}
161
ответ дан 24 November 2019 в 10:51
поделиться

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

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;
}
7
ответ дан 24 November 2019 в 10:51
поделиться

Я добавил строку

$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

0
ответ дан 24 November 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: