Frage Magento - Abrufen von Produkten mit einem bestimmten Attributwert


In meinem Blockcode versuche ich programmatisch eine Liste von Produkten abzurufen, die ein Attribut mit einem bestimmten Wert haben.

Alternativ, wenn das nicht möglich ist, wie würde man alle Produkte abrufen und dann filtern, um nur die Produkte mit einem bestimmten Attribut aufzulisten?

Wie würde ich eine Suche mit standardmäßigen booleschen Filtern durchführen? AND oder OR zu einer Untergruppe meiner Produkte passen?


76
2017-08-26 06:41


Ursprung


Antworten:


Fast alle Magento-Modelle verfügen über ein entsprechendes Collection-Objekt, das zum Abrufen mehrerer Instanzen eines Modells verwendet werden kann.

Gehen Sie folgendermaßen vor, um eine Produktsammlung zu instanziieren

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

Produkte sind ein Magento EAV-Stilmodell, daher müssen Sie zusätzliche Attribute hinzufügen, die Sie zurückgeben möchten.

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

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

Es gibt mehrere Syntaxen zum Festlegen von Filtern für Sammlungen. Ich verwende immer die ausführliche unten, aber vielleicht möchten Sie die Magento-Quelle für zusätzliche Möglichkeiten untersuchen, wie die Filtermethoden verwendet werden können.

Im Folgenden wird gezeigt, wie nach einem Bereich von Werten gefiltert wird (größer als UND kleiner als).

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

Während dies durch einen Namen gefiltert wird, der einer Sache ODER einer anderen gleicht.

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

Eine vollständige Liste der unterstützten Kurzbedingungen (eq, lt usw.) finden Sie in der _getConditionSql Methode in lib/Varien/Data/Collection/Db.php

Schließlich können alle Magento-Sammlungen iteriert werden (die Basis-Erfassungsklasse implementiert eine der Iterator-Schnittstellen). So greifen Sie Ihre Produkte an, sobald Filter eingestellt sind.

$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
2017-08-27 04:01



Dies ist ein Follow-up zu meiner ursprünglichen Frage, um anderen mit dem gleichen Problem zu helfen. Wenn Sie nach einem Attribut filtern müssen, anstatt manuell nach der ID zu suchen, können Sie den folgenden Code verwenden, um alle ID-, Wert-Paare für ein Attribut abzurufen. Die Daten werden als Array mit dem Attributnamen als Schlüssel zurückgegeben.

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

Hier ist eine Funktion, die Sie verwenden können, um Produkte anhand ihrer Attributsatz-ID abzurufen. Mit der vorherigen Funktion abgerufen.

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
2018-01-27 22:34



$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
2017-09-05 17:36



Bekommen TEXT Attribute, die von admin zum Frontend auf der Produktlistenseite hinzugefügt wurden.

Danke Anita Mourya

Ich habe festgestellt, dass es zwei Methoden gibt. Nehmen wir an, das Produktattribut "na_author" wird vom Backend als Textfeld hinzugefügt.

METHODE 1

auf list.phtml

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

FÜR JEDES PRODUKT LADEN SIE NACH SKU UND ERHALTEN SIE ATTRIBUTE INSIDE 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 "";}
?>

Methode 2

Mage/Catalog/Block/Product/List.phtml OVER RIDE und im 'lokalen Ordner' eingestellt

d.h. Kopie von

Mage/Catalog/Block/Product/List.phtml

und PASTE TO

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

Ändern Sie die Funktion, indem Sie 2 fett gedruckte Zeilen hinzufügen.

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;

}

und du wirst glücklich sein, es zu sehen .... !!


3
2017-09-06 10:41



create Attributname ist "price_screen_tab_name". und Zugriff mit dieser einfachen Formel.

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

2
2018-06-09 09:09



Ich habe Zeile hinzugefügt

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

im

App / Code / Kern / Mage / Katalog / Block / Produkt / List.php in Zeile 95

in Funktion _getProductCollection() 

und dann ruf es an

app / design / frontend / default / hellopress / template / katalog / produkt / list.phtml

Durch das Schreiben von Code

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

Jetzt funktioniert es in Magento 1.4.x


0
2018-06-04 22:20