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 AND oder OR , um eine Teilmenge meiner Produkte abzugleichen?

   

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 _getConditionSql (eq, lt usw.) finden Sie in der Methode _getConditionSql 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()); } 

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 function, die Sie verwenden können, um Produkte anhand ihrer Attributsatz-ID abzurufen. Mit der vorherigen function 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; } 
 $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 "

Manufacturers

    "; foreach($preparedManufacturers as $optionId => $value) { $products = Mage::getModel('catalog/product')->getCollection(); $products->addAttributeToSelect('manufacturer'); $products->addFieldToFilter(array( array('attribute'=>'manufacturer', 'eq'=> $optionId, )); echo "
  • " . $value . " - (" . $optionId . ") - (Products: ".count($products).")
  • "; } echo "
"; }

Um TEXT Attribute vom Administrator zum Frontend auf der Produktlistenseite hinzuzufügen.

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 "
By ".$author ."";} else{echo "";} ?>

Methode 2

Mage/Catalog/Block/Product/List.phtml OVER RIDE und legen Sie in ‘lokalen Ordner’

dh Kopieren von

 Mage/Catalog/Block/Product/List.phtml 

und PASTE TO

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

Ändern Sie die function, 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 …. !!

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');?> 

Ich habe Zeile hinzugefügt

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

im

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

in der function _getProductCollection()

und dann ruf es an

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

Durch das Schreiben von Code

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

Jetzt funktioniert es in Magento 1.4.x