Block für zufällige Produkte erstellen
Sie sollten ein benutzerdefiniertes Modul mit einem neuen Blocktyp erstellen. Ich würde eine Erweiterung empfehlen. Mage_Catalog_Block_Product_List
Wenn das Standardlayout der Produktliste für Sie ausreicht, müssen Sie nicht einmal Ihre eigene Vorlage entwerfen.
Dann überschreiben _getProductCollection()
oder wenn Sie nicht erweitern, Mage_Catalog_Block_Product_list
schreiben Sie eine neue öffentliche Methode getProductCollection()
.
So bereiten Sie die Produktkollektion auf diese Weise vor:
Sammlungsfilter
Erstellen Sie zunächst die Sammlung und wenden Sie den Standardfilter an (im Katalog sichtbar und im aktuellen Store verfügbar):
$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection
->addStoreFilter()
->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
Performante Zufallsauswahl
ORDER BY RAND()
ist bei großen Tabellen nicht leistungsfähig, da dies zu einer ressourcenintensiven temporären Tabellenkopie führt. Es muss alle Ergebnisse in eine temporäre Tabelle laden, jeder Zeile eine Zufallszahl zuweisen und dann ohne Index sortieren. Stattdessen rufen wir alle IDs ab (dies ist schneller und die Datenmenge ist auch für große Kataloge verwaltbar), wählen einige zufällig aus und rufen diese Zeilen direkt ab.
Fügen Sie dazu diesen Code ein, nachdem die Filter für die Sammlung angewendet wurden:
$numberOfItems = 4;
$candidateIds = $productCollection->getAllIds();
$choosenIds = [];
$maxKey = count($candidateIds)-1;
while (count($choosenIds) < $numberOfItems)) {
$randomKey = mt_rand(0, $maxKey);
$choosenIds[$randomKey] = $candidateIds[$randomKey];
}
$productCollection->addIdFilter($choosenIds);
Sie können darüber ausführlich in meinem Blog lesen: http://www.schmengler-se.de/de/2015/09/show-random-products-in-magento-you-are-doing-it-wrong/
Erforderliche Attribute abrufen
Anschließend geben wir die zu ladenden Attribute an und verknüpfen Preis- und URL-Indizes, um den richtigen Preis und die richtige Produkt-URL anzeigen zu können:
$productCollection
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();
Zu guter Letzt geben Sie die Sammlung zurück:
return $productCollection;
Diese Sammlung kann jetzt in Mage_Catalog_Block_Product_List
Blöcken oder in Ihrer eigenen Vorlage verwendet werden, foreach ($this->getProductCollection() as $product)
wie in Marius 'Antwort.
Benutzerdefinierten Block in CMS einfügen
Verwenden Sie diesen Code, um den Block in Ihre Homepage einzufügen, your/block
wobei der Alias für Ihre Blockklasse gilt:
{{block type="your/block" name="random_products" template="catalog/product/list.phtml" column_count="4"}}
Geben Sie bei Bedarf Ihre eigene Vorlage an. column_count
wird verwendet von Mage_Catalog_Block_Product_List
.
Anmerkungen
Alternativ können Sie den gesamten PHP-Code von oben in Ihre Vorlage einfügen. Dies ist jedoch ziemlich chaotisch und verstößt gegen die Codierungsstandards und Best Practices von Magento.
Anscheinend wird Magento mit einem eigenen vordefinierten Blocktyp geliefert catalog/product_list_random
, der jedoch verwendet order('rand()')
wird. Daher werde ich ihn aus den oben erläuterten Leistungsgründen nicht empfehlen.