Вопрос

Я пытаюсь получить 4 случайных продукта на домашней странице, используя PHP в файле TPL, который я создал. Я хотел бы иметь возможность форматировать продукты в цикле Foreach, поскольку я использую форматирование в коде, показанном ниже ...

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

Я попробовал несколько вещей, найденных в Google, но пока не повезло. Установка категорий в массиве, безусловно, будет работать для того, что я пытаюсь сделать, но это также будет работать, если бы категории были случайными.

Спасибо!

Это было полезно?

Решение

Попробуй это. Я работал на себя:

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

Другие советы

Создайте блок для случайных продуктов

Вы должны создать пользовательский модуль с новым типом блока. Я бы порекомендовал расширить Mage_Catalog_Block_Product_List, тогда, если для вас достаточно макета списка продуктов по умолчанию, вам даже не нужно разрабатывать свой собственный шаблон.

Затем переопределить _getProductCollection() или если вы не распространяетесь Mage_Catalog_Block_Product_list Напишите новый публичный метод getProductCollection().

Как подготовить сбор продукта в этом методе:

Фильтр коллекции

Во -первых, создайте коллекцию и примените стандартный фильтр (видимый в каталоге и доступен в текущем магазине):

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

Выводящий случайный выбор

ORDER BY RAND() является неэффективным в больших таблицах, потому что это приводит к ресурсной интенсивной копии таблицы температуры. Он должен загрузить все результаты во временную таблицу, назначить случайное число в каждую строку, а затем сортировать без какого -либо индекса. Вместо этого мы получаем все идентификаторы (это быстрее, и объем данных управляется даже для больших каталогов), выбираем некоторые случайным образом и получаем эти строки напрямую.

Для этого вставьте этот код после применения фильтров для сбора:

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

Вы можете прочитать об этом подробно в моем блоге: http://www.schmengler-se.de/en/2015/09/show-random-products-in-magento-you-ale-doing-it-wrong/

Получить необходимые атрибуты

Затем мы указываем атрибуты, которые будут загружены, и индексы соединения и индексы URL, чтобы показать правильную цену и URL -адрес продукта:

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

И последнее, но не менее важное, верните коллекцию:

return $productCollection;

Эта коллекция теперь можно использовать в Mage_Catalog_Block_Product_List блоки или в вашем собственном шаблоне с foreach ($this->getProductCollection() as $product) Как в ответе Мариуса.


Вставьте пользовательский блок в CMS

Используйте этот код, чтобы вставить блок на домашнюю страницу, с your/block Быть псевдонимом для вашего класса блока:

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

Укажите свой собственный шаблон, если это необходимо. column_count используется Mage_Catalog_Block_Product_List.


Заметки

  1. В качестве альтернативы вы можете поместить весь PHP -код сверху в своем шаблоне, но это довольно грязно и нарушает стандарты кодирования Magento и лучшие практики.

  2. Очевидно, Magento поставляется со своим предопределенным типом блока catalog/product_list_random, но он использует order('rand()'), Поэтому я не буду рекомендовать его по причинам производительности, объясненным выше.

Вы можете попытаться загрузить всю коллекцию продуктов в пользовательском блоке и использовать array_rand Чтобы выбрать 5 идентификаторов, которые возвращаются в файл TPL.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top