it-swarm.com.de

Magento - Abrufen von Produkten mit einem bestimmten Attributwert

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

Wenn dies nicht möglich ist, wie kann man dann alle Produkte abrufen und filtern, um nur die Produkte mit einem bestimmten Attribut aufzulisten?

Wie führe ich eine Suche mit den Standard-Booleschen Filtern AND oder OR durch, um eine Teilmenge meiner Produkte zu finden?

77
Christian

Fast alle Magento-Modelle verfügen über ein entsprechendes Collection-Objekt, mit dem mehrere Instanzen eines Modells abgerufen werden können.

Führen Sie die folgenden Schritte aus, um eine Produktsammlung zu instanziieren

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

Bei den Produkten handelt es sich um ein Magento EAV-Modell. Sie müssen daher 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 unten stehende ausführliche, aber Sie möchten vielleicht die Magento-Quelle auf zusätzliche Möglichkeiten untersuchen, wie die Filtermethoden verwendet werden können.

Im Folgenden wird gezeigt, wie nach einem Wertebereich 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'),
));

Dabei wird nach einem Namen gefiltert, der einer Sache entspricht OR eine andere.

$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 durchlaufen werden (die Basissammlungsklasse implementiert eine der Iterator-Schnittstellen). So greifen Sie zu Ihren Produkten, sobald die 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('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

Dies ist eine Fortsetzung meiner ursprünglichen Frage, um anderen mit demselben Problem zu helfen. Wenn Sie nach einem Attribut filtern müssen, anstatt die ID manuell nachzuschlagen, 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, mit der Sie Produkte anhand ihrer Attributsatz-ID abrufen können. 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
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

Um TEXT Attribute zu erhalten, die vom Administrator zum Front-End auf der Produktlistenseite hinzugefügt wurden.

Vielen Dank, Anita Mourya

Ich habe festgestellt, dass es zwei Methoden gibt. Angenommen, 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 JEDE PRODUKTLADUNG NACH ARTIKELNUMMER UND INSIDE FOREACH ZUSCHREIBEN

<?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 in 'local folder' setzen

d. h. Kopieren 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 markierte 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 Sie werden sich freuen, es zu sehen .... !!

3
Pragnesh Karia

attributname erstellen ist "price_screen_tab_name ". und greifen Sie mit dieser einfachen Formel zu.

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

Ich habe Linie hinzugefügt

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

im

app/code/core/Mage/Catalog/Block/Product/List.php in Zeile 95

in der Funktion _getProductCollection()

und dann anrufen

app/design/frontend/default/hellopress/template/catalog/product/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
Anita Mourya