Пример функции randomProducts, реализованной в файле helper.php шаблона под видом метода нашего объекта $myHelper. Эта функция использует примитивную инструкцию выборки случайных записей, которая ресурсоёмкая в случае многотысячной базы товаров.
<?php
class TemplateEmulator {
protected $cms;
public function __construct ( & $cms ) {
$this->cms = & $cms;
$cms->smarty->assignByRef('myHelper', $this);
}
public function randomProducts ( $count, $cats = null ) {
$where = '';
if (!empty($cats) && is_array($cats)) {
foreach ($cats as $index => value) $cats[$index] = intval($value);
$where = 'WHERE `category_id` IN (' . implode(',', $cats) . ') ';
}
$count = intval($count);
$this->cms->db->query('SELECT `product_id` ' .
'FROM `products` ' .
$where .
'ORDER BY RAND() ' .
'LIMIT ' . $count);
$items = $this->cms->db->results();
if (!empty($items)) {
$ids = array();
foreach ($items as $index) {
$index = intval($index->product_id);
$ids[$index] = $index;
}
$filter = new stdClass;
$filter->ids = implode(',', $ids);
$this->cms->db->products->get($items, $filter);
$this->cms->db->products->unpackRecords($items, $filter);
}
return $items;
}
}
?>
Пример вызова такой функции: 8 случайных товаров из текущей категории и её подкатегорий. Если находимся вне категории, например на какой-нибудь статической странице, тогда 8 случайных товаров из всего каталога товаров.
{$cats = $category->subcats_ids|default:FALSE}
{$items = $myHelper->randomProducts(8, $cats)}
И далее выводим прочитанные записи подходящим нам образом:
{foreach $items as $item}
Товар {name}
Краткое описание {annotation}
Полное описание {body}
Страница {url}
Главное фото {findImage type=product assign=image}
фото {$image.url}
мини {$image.thumb}
alt {$image.alt}
описание {$image.desc}
ссылка {$image.link}
Доп.фотографии {$number = 2}
{section name=images loop=1000}
{findImage type=product num=$number assign=image}
{if empty($image.found)}{break}{/if}
фото {$image.url}
мини {$image.thumb}
alt {$image.alt}
описание {$image.desc}
ссылка {$image.link}
{$number = $number + 1}
{/section}
Цена {discountPrice}
В корзину {cartUrl}
В отложенные {cartUrl assign=url}
{$url|replace:'/cart':'/defer'}
В сравнение {site}compare/{inputValue from='item->url'}
Характеристики {if !empty($item->properties_tree)}
{foreach $item->properties_tree as $prop}
{$v = reset($prop)}
{name from=v}: {foreach $prop as $v}
{echoVar from='v->value'}
{/foreach}
{/foreach}
{/if}
{/foreach}