risposta-alla-domanda-sullo-sviluppo-web-bd.com

Magento: recupera i prodotti con un valore di attributo specifico

Nel mio codice di blocco sto cercando di recuperare a livello di codice un elenco di prodotti che hanno un attributo con un valore specifico.

In alternativa, se ciò non fosse possibile, come recuperare tutti i prodotti, filtrarli per elencarli con un attributo specifico?

Come eseguirò una ricerca utilizzando i filtri booleani standard AND o OR per abbinare un sottoinsieme dei miei prodotti?

77
Christian

Quasi tutti i modelli Magento hanno un oggetto Collection corrispondente che può essere utilizzato per recuperare più istanze di un modello.

Per creare un'istanza di una raccolta prodotti, procedere come segue

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

I prodotti sono un modello in stile EAV Magento, quindi dovrai aggiungere eventuali attributi aggiuntivi che desideri restituire.

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

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

Esistono più sintassi per l'impostazione dei filtri sulle raccolte. Uso sempre quello dettagliato qui sotto, ma potresti voler ispezionare la fonte Magento per ulteriori modi in cui i metodi di filtro possono essere usati.

Di seguito viene illustrato come filtrare in base a un intervallo di valori (maggiore di E inferiore a)

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

Mentre questo filtrerà per un nome che equivale a una cosa OR un'altra.

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

Un elenco completo dei condizionali corti supportati (eq, lt, ecc.) È disponibile nel _getConditionSql metodo in lib/Varien/Data/Collection/Db.php

Infine, è possibile eseguire l'iterazione di tutte le raccolte di Magento (la classe di raccolta di base implementa sulle interfacce dell'iteratore). Ecco come afferrerai i tuoi prodotti una volta impostati i filtri.

$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());
}
160
Alan Storm

Questo è un seguito alla mia domanda originale per aiutare gli altri con lo stesso problema. Se è necessario filtrare in base a un attributo, anziché cercare manualmente l'id, è possibile utilizzare il codice seguente per recuperare tutti gli ID, coppie di valori per un attributo. I dati vengono restituiti come un array con il nome dell'attributo come chiave.

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

Ecco una funzione che puoi utilizzare per ottenere prodotti in base al loro ID set di attributi. Recuperato utilizzando la funzione precedente.

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
Christian
$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
verheesj

Per ottenere TEXT attributi aggiunti dall'amministratore al front-end nella pagina di elenco dei prodotti.

Grazie Anita Mourya

Ho scoperto che ci sono due metodi. Supponiamo che l'attributo del prodotto chiamato "na_author" venga aggiunto dal backend come campo di testo.

METODO 1

su list.phtml

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

PER OGNI CARICO DEL PRODOTTO PER CODICE E OTTENERE ATTRIBUTO ALL'INTERNO

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

METODO 2

Mage/Catalog/Block/Product/List.phtml OVER RIDE e impostato in 'cartella locale'

cioè Copia da

Mage/Catalog/Block/Product/List.phtml

e INCOLLARE

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

cambia la funzione aggiungendo 2 righe mostrate in grassetto di seguito.

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;

}

e sarai felice di vederlo .... !!

3
Pragnesh Karia

creare il nome dell'attributo è "price_screen_tab_name ". e accedi usando questa semplice formula.

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

Ho aggiunto una riga

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

nel

app/code/core/Mage/Catalog/Block/Product/List.php sulla linea 95

nella funzione _getProductCollection()

e poi chiamalo

app/design/frontend/default/hellopress/template/catalogo/prodotto/list.phtml

Scrivendo il codice

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

Ora funziona in Magento 1.4.x

0
Anita Mourya