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




3 Answers

Почти все модели 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());
}
документация для

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

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

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




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



создать имя атрибута - « price_screen_tab_name ». и доступ с использованием этой простой формулы.

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



Related