Fast alle Magento-Modelle verfügen über ein entsprechendes Collection-Objekt, mit dem mehrere Instanzen eines Modells abgerufen werden können.
Gehen Sie wie folgt vor, 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 alle zusätzlichen Attribute hinzufügen, die Sie zurückgeben möchten.
$collection = Mage::getModel('catalog/product')->getCollection();
$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 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');
$collection->addFieldToFilter(array(
array('attribute'=>'orig_price','gt'=>'100'),
));
$collection->addFieldToFilter(array(
array('attribute'=>'orig_price','lt'=>'130'),
));
Dabei wird nach einem Namen gefiltert, der der einen oder anderen Sache entspricht.
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
$collection->addFieldToFilter(array(
array('attribute'=>'name','eq'=>'Widget A'),
array('attribute'=>'name','eq'=>'Widget B'),
));
Eine vollständige Liste der unterstützten kurzen Bedingungen (Gl., Lt usw.) finden Sie in der _getConditionSql
Methode inlib/Varien/Data/Collection/Db.php
Schließlich können alle Magento-Sammlungen iteriert werden (die Basissammlungsklasse implementiert eine der Iterator-Schnittstellen). So greifen Sie auf Ihre Produkte zu, sobald die Filter eingestellt sind.
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');
$collection->addAttributeToSelect('orig_price');
$collection->addFieldToFilter(array(
array('attribute'=>'name','eq'=>'Widget A'),
array('attribute'=>'name','eq'=>'Widget B'),
));
foreach ($collection as $product) {
var_dump($product->getData());
}
'name' => 'orig_price'
- ist das richtig? Sollte es nicht sein'attribute' => 'name'
?Dies ist eine Fortsetzung meiner ursprünglichen Frage, um anderen mit dem gleichen 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-Wertepaare 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; }
quelle
$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>"; }
quelle
So erhalten Sie
TEXT
Attribute, die vom Administrator zum Front-End auf der Produktlistenseite hinzugefügt wurden.Danke 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 JEDES PRODUKT LADEN NACH SKU UND ERHALTEN SIE ATTRIBUT INNEN
<?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 'lokaler Ordner' setzendh 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 fettgedruckte 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 es gerne sehen .... !!
quelle
Der Attributname erstellen ist "
price_screen_tab_name
". und Zugriff mit dieser einfachen Formel.<?php $_product = $this->getProduct(); ?> <?php echo $_product->getData('price_screen_tab_name');?>
quelle
Ich habe Zeile hinzugefügt
$this->_productCollection->addAttributeToSelect('releasedate');
im
in Funktion
_getProductCollection()
und dann anrufen
Durch Schreiben von Code
<div><?php echo $this->__('Release Date: %s', $this->dateFormat($_product->getReleasedate())) ?> </div>
Jetzt funktioniert es in Magento 1.4.x.
quelle