Vier zufällige Produkte auf der Homepage

7

Ich versuche, 4 zufällige Produkte mit PHP in einer von mir erstellten TPL-Datei auf die Homepage zu bringen. Ich möchte in der Lage sein, die Produkte in einer foreach-Schleife zu formatieren, da ich einige Formatierungen im folgenden Code verwende ...

<div class="three columns">
  <div class="product_container no_border">
    <div class="product">
      <a href="product_page.html"><img src="<?php echo $this->getSkinUrl('images/products/place_holder.jpg'); ?>" alt=" "></a>
    </div>

    <div class="product_title">
      <a href="product_page.html">240 Serving Package</a>
    </div>

    <div class="price_hp">$454.99</div>

    <div class="free_shipping">
      <div class="fs"></div>
      Free shipping for this package
    </div>

    <div class="shop_btn">
      <a href="#">ADD TO CART</a>
    </div>
  </div>
</div>

Ich habe ein paar Dinge ausprobiert, die bei Google gefunden wurden, aber noch kein Glück. Das Festlegen von Kategorien in einem Array würde sicherlich für das funktionieren, was ich versuche, aber es würde auch funktionieren, wenn die Kategorien zufällig wären.

Vielen Dank!

Brian Schroeter
quelle

Antworten:

9

Versuche dies. Ich habe für mich gearbeitet:

$products = Mage::getModel('catalog/product')->getCollection();
$products->addAttributeToSelect(array('name', 'thumbnail', 'price')); //feel free to add any other attribues you need.
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products); 
$products->getSelect()->order('RAND()');
$products->getSelect()->limit(4);
foreach ($products as $product)  : ?>

<div class="three columns">
  <div class="product_container no_border">
    <div class="product">
      <a href="<?php echo $product->getProductUrl()?>"><img src="<?php echo Mage::helper('catalog/image')->init($product, 'thumbnail')->resize(100, 80)?>" alt=""></a>
    </div>

    <div class="product_title">
      <a href="<?php echo $product->getProductUrl()?>"><?php echo $product->getName()?></a>
    </div>

    <div class="price_hp"><?php echo Mage::app()->getStore()->getCurrentCurrency()->format($product->getFinalPrice());?></div>

    <div class="free_shipping">
      <div class="fs"></div>
      Free shipping for this package
    </div>

    <div class="shop_btn">
      <a href="<?php echo Mage::helper('checkout/cart')->getAddUrl($product)?>">ADD TO CART</a>
    </div>
  </div>
</div>
<?php 
endforeach;?>
Marius
quelle
Hey Marius! Das hat funktioniert - vielen Dank! Können Sie mir (möglicherweise) sagen, warum die Schaltfläche zum Hinzufügen zum Warenkorb nicht funktioniert? Die Demo ist verfügbar unter dev.wisefoodsupply.com
Brian Schroeter
Eigentlich funktioniert nichts außer der Homepage. Sie haben keine Ausführungsrechte für index.php. Zumindest steht das in der Fehlermeldung.
Marius
2
Verwenden Sie ORDER BY RAND () nicht für einen großen Katalog, da es Leistungsprobleme gibt
Fabian Schmengler
Ich werde Ihren Beitrag nicht bearbeiten, aber können Sie bitte überprüfen Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);? Scheint nichts zu tun.
SV3N
Es hat vor 5 Jahren etwas gemacht ... Ich denke.
Marius
4

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_ListWenn 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_listschreiben 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_ListBlö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/blockwobei 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_countwird verwendet von Mage_Catalog_Block_Product_List.


Anmerkungen

  1. 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.

  2. 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.

Fabian Schmengler
quelle
0

Sie können versuchen, die gesamte Produktsammlung in einen benutzerdefinierten Block zu laden und array_randdie 5 IDs auszuwählen, die an die TPL-Datei zurückgegeben werden.

http://php.net/manual/en/function.array-rand.php

Derrik Nyomo
quelle
3
Das ist keine gute Idee. Was ist, wenn Sie 30.000 Produkte haben? Eigentlich ist die Auflistung von zufälligen Produkten keine gute Idee, aber wenn Sie dies tun müssen, ist das Laden der gesamten Sammlung nicht der richtige Weg.
Marius