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