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?
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());
}
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;
}
$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>";
}
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 .... !!
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');?>
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