Domanda

Sto cercando di ottenere 4 prodotti casuali sulla home page utilizzando PHP all'interno di un file TPL ho creato. Mi piacerebbe essere in grado di formattare i prodotti in un ciclo foreach come sto utilizzando alcuni formattazione nel codice visto qui sotto ...

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

ho ancora provato un paio di cose trovate su Google, ma senza fortuna. Impostazione di categorie in un array sarebbe certamente il lavoro per quello che sto cercando di fare, ma che sarebbe anche il lavoro se le categorie erano casuali.

Grazie!

È stato utile?

Soluzione

Prova questo. Ho lavorato per me:

$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;?>

Altri suggerimenti

Crea blocco per Random Prodotti

Si dovrebbe creare un modulo personalizzato con un nuovo tipo di blocco. Mi consiglia di estendere Mage_Catalog_Block_Product_List, quindi se i suffissi di layout lista dei prodotti di default per voi, non hanno nemmeno bisogno di progettare il proprio modello.

Poi ignorare _getProductCollection() o se non si estendono Mage_Catalog_Block_Product_list scrivere un nuovo metodo pubblico getProductCollection().

Come preparare la collezione di prodotti in questo metodo:

Raccolta Filtro

In primo luogo, creare la raccolta e applicare il filtro standard (visibile in catalogo e disponibile in negozio di corrente):

$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection
    ->addStoreFilter()
    ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());

Performant selezione casuale

ORDER BY RAND() è unperformant su grandi tavoli perché si traduce in una risorsa intensiva copia tabella temporanea. Si deve caricare tutti i risultati in una tabella temporanea, assegnare un numero casuale per ogni riga e quindi senza alcuna sorta di indice. Invece recuperiamo tutti gli ID (questo è più veloce e la quantità di dati è gestibile anche per i cataloghi di grandi dimensioni), scegliere alcuni in modo casuale e recuperare direttamente queste righe.

Per farlo, inserire il codice dopo che sono stati applicati i filtri per la raccolta:

$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);

Si può leggere su di esso in dettaglio nel mio blog: http://www.schmengler-se.de/en/2015/09/show-random-products-in-magento-you-are-doing-it- sbagliato /

Recuperare attributi necessari

Poi, specifichiamo gli attributi per essere caricati e uniamo prezzo e degli URL indici di essere in grado di mostrare il giusto prezzo e l'URL del prodotto:

$productCollection
    ->addMinimalPrice()
    ->addFinalPrice()
    ->addTaxPercents()
    ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
    ->addUrlRewrite();

Ultimo ma non meno importante, riportare la collezione:

return $productCollection;

Questa raccolta può ora essere utilizzato in blocchi Mage_Catalog_Block_Product_List o il proprio modello con foreach ($this->getProductCollection() as $product) come in risposta Marius'.


Inserisci blocchi personalizzati in CMS

Usa questo codice per inserire il blocco nella vostra home page, con your/block essendo l'alias per la classe di blocco:

{{block type="your/block" name="random_products" template="catalog/product/list.phtml" column_count="4"}}

Specifica il proprio modello, se necessario. column_count viene utilizzato da Mage_Catalog_Block_Product_List.


Note

  1. In alternativa si potrebbe mettere tutto il codice PHP dall'alto nel vostro template, ma questo è abbastanza disordinato e viola gli standard di codifica di Magento e le best practice.

  2. A quanto pare Magento è dotato di un proprio tipo di blocco predefinito catalog/product_list_random, ma utilizza order('rand()'), quindi non mi consiglio per le prestazioni ragioni spiegate in precedenza.

Si potrebbe provare a caricare l'intera collezione prodotto in un costume di blocco e l'uso array_rand di individuare le 5 ID che vengono restituiti al file TPL.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top