Pregunta

Estoy tratando de conseguir 4 productos al azar en la página web usando PHP dentro de un archivo TPL que he creado. Me gustaría ser capaz de dar formato a los productos en un bucle foreach que estoy usando algún formato en el código se muestra a continuación ...

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

He intentado algunas cosas que se encuentran en Google, pero sin suerte todavía. El establecimiento de categorías en una matriz, sin duda, el trabajo de lo que estoy tratando de hacer, pero había también un trabajo si las categorías fueron al azar.

Gracias!

¿Fue útil?

Solución

Probar. He trabajado para mí:

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

Otros consejos

Crear bloque para los productos al azar

Se debe crear un módulo personalizado con un nuevo tipo de bloque. Se lo recomiendo a extender Mage_Catalog_Block_Product_List, entonces si las basta lista de producto por defecto de diseño para usted, usted ni siquiera necesita para diseñar su propia plantilla.

A continuación, anular _getProductCollection() o si no se extienden Mage_Catalog_Block_Product_list escribir un nuevo método público getProductCollection().

Cómo preparar la recogida del producto en este método:

Colección filtros

En primer lugar, crear la colección y aplicar el filtro estándar (visible en catálogo y disponible en la tienda actual):

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

Performant Selección aleatoria

ORDER BY RAND() es unperformant en tablas grandes porque da lugar a una gran cantidad de recursos de copia de tabla temporal. Tiene que cargar todos los resultados en una tabla temporal, asignar un número aleatorio a cada fila y luego sin ningún tipo de índice. En vez recuperamos todos los identificadores (esto es más rápido y la cantidad de datos es manejable incluso para grandes catálogos), recoger algunas al azar y recuperar estas filas directamente.

Para ello, inserte el código una vez aplicados los filtros para la colección:

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

Se puede leer sobre ello en detalle en mi blog: http://www.schmengler-se.de/en/2015/09/show-random-products-in-magento-you-are-doing-it- mal /

recuperar los atributos necesarios

A continuación, se especifica los atributos para ser cargados y unirse a los precios y los índices de URL para poder mostrar el precio correcto y la dirección URL del producto:

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

Por último, pero no menos importante, devolver la colección:

return $productCollection;

Esta colección se puede utilizar ahora en bloques Mage_Catalog_Block_Product_List o en la propia plantilla con foreach ($this->getProductCollection() as $product) como en respuesta Marius'.


Insertar bloque personalizado En CMS

Usar el código para insertar el bloque en su página principal, con your/block siendo el alias para su clase bloque:

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

Especificar su propia plantilla si es necesario. column_count es utilizado por Mage_Catalog_Block_Product_List.


Notas

  1. Como alternativa se puede poner todo el código PHP desde arriba en su plantilla, pero esto es bastante desordenado y viola las normas de codificación de Magento y las mejores prácticas.

  2. Al parecer Magento viene con su propio catalog/product_list_random tipo de bloque predefinido, pero utiliza order('rand()'), así que no recomendaría para el desempeño razones explicadas anteriormente.

Se podría tratar de cargar toda la colección de productos en una costumbre y el uso de bloques array_rand para escoger los 5 identificaciones que se devuelven al archivo TPL.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top