Четыре случайных продукта на домашней странице
-
16-10-2019 - |
Вопрос
Я пытаюсь получить 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
.
Заметки
В качестве альтернативы вы можете поместить весь PHP -код сверху в своем шаблоне, но это довольно грязно и нарушает стандарты кодирования Magento и лучшие практики.
Очевидно, Magento поставляется со своим предопределенным типом блока
catalog/product_list_random
, но он используетorder('rand()')
, Поэтому я не буду рекомендовать его по причинам производительности, объясненным выше.
Вы можете попытаться загрузить всю коллекцию продуктов в пользовательском блоке и использовать array_rand
Чтобы выбрать 5 идентификаторов, которые возвращаются в файл TPL.