Четыре случайных продукта на главной странице


Я пытаюсь разместить 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, но пока безуспешно. Установка категорий в массиве, безусловно, сработала бы для того, что я пытаюсь сделать, но это также сработало бы, если бы категории были случайными.

Спасибо!

Author: Fabian Schmengler, 2013-05-02

3 answers

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

$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;?>
 9
Author: Marius, 2013-05-02 19:02:47

Создать Блок Для Случайных Продуктов

Вам следует создать пользовательский модуль с новым типом блока. Я бы рекомендовал расширить 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-are-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()'), поэтому я не буду рекомендовать его по причинам производительности, описанным выше.

 4
Author: Fabian Schmengler, 2015-09-25 07:29:54

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

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

 0
Author: Derrik Nyomo, 2016-03-24 15:10:20