Magento-Recuperar productos con un valor de atributo específico


En mi código de bloque estoy tratando de recuperar programáticamente una lista de productos que tienen un atributo con un valor específico.

Alternativamente, si eso no es posible, ¿cómo se recuperarían todos los productos y luego se filtrarían para enumerar los productos con un atributo específico?

¿Cómo realizaría una búsqueda usando filtros booleanos estándar AND o OR para que coincida con un subconjunto de mis productos?

Author: Mufaddal, 2009-08-26

6 answers

Casi todos los modelos de Magento tienen un objeto de colección correspondiente que se puede usar para obtener varias instancias de un Modelo.

Para crear una instancia de una colección de productos, haga lo siguiente

$collection = Mage::getModel('catalog/product')->getCollection();

Los productos son un modelo de estilo Magento EAV, por lo que deberá agregar cualquier atributo adicional que desee devolver.

$collection = Mage::getModel('catalog/product')->getCollection();

//fetch name and orig_price into data
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

Hay múltiples sintaxis para establecer filtros en las colecciones. Siempre uso el detallado a continuación, pero es posible que desee inspeccionar la fuente de Magento para formas adicionales de utilizar los métodos de filtrado.

A continuación se muestra cómo filtrar por un rango de valores (mayor que Y menor que)

$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'),
));

Mientras que esto se filtrará por un nombre que equivale a una cosa U otra.

$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'),        
));

Una lista completa de los condicionales cortos soportados (eq,lt, etc.) se puede encontrar en el método _getConditionSql en lib/Varien/Data/Collection/Db.php

Finalmente, todas las colecciones de Magento pueden ser iteradas (la clase de colección base implementa una de las interfaces del iterador). Así es como cogerás tus productos una vez que los filtros estén configurados.

$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());
}
 160
Author: Alan Storm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-02 01:19:05

Esta es una continuación de mi pregunta original para ayudar a otros con el mismo problema. Si necesita filtrar por un atributo, en lugar de buscar manualmente el id, puede usar el siguiente código para recuperar todos los pares de id y valores de un atributo. Los datos se devuelven como una matriz con el nombre del atributo como clave.

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

Aquí hay una función que puede usar para obtener productos por su id de conjunto de atributos. Recuperado usando la función anterior.

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
Author: Christian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-27 22:57:32
$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>";
}
 5
Author: verheesj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-05 17:36:44

Para obtener TEXT atributos agregados desde el administrador al front end en la página de listado de productos.

Gracias Anita Mourya

He encontrado que hay dos métodos. Digamos que el atributo de producto llamado "na_author" se agrega desde el backend como campo de texto.

MÉTODO 1

On list.phtml

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

PARA CADA PRODUCTO DE CARGA POR SKU Y OBTENER ATRIBUTO DENTRO DE 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 "";}
?>

MÉTODO 2

Mage/Catalog/Block/Product/List.phtml SOBRE PASEO y establecer en 'carpeta local'

I. e. Copy From

Mage/Catalog/Block/Product/List.phtml

Y PEGAR A

app/code/local/Mage/Catalog/Block/Product/List.phtml

Cambie la función agregando 2 líneas que se muestran en negrita a continuación.

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;

}

Y estarás feliz de verlo....!!

 3
Author: Pragnesh Karia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-10 12:51:16

El nombre del atributo Create es "price_screen_tab_name". y acceder usando esta sencilla fórmula.

<?php $_product = $this->getProduct(); ?>
<?php echo $_product->getData('price_screen_tab_name');?>
 2
Author: Pratik Kamani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-05 11:06:17

He añadido la línea

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

En

App/code/core/Mage/Catalog/Block/Product/List.php en línea 95

En función _getProductCollection()

Y luego llamarlo en

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

Escribiendo código

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

Ahora funciona en Magento 1.4.x

 0
Author: Anita Mourya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-03 09:17:03