Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Следить
Главная
15:26
20 янв
#
?
написал:

Добрый день.

Нужен блок случайных товаров. Сейчас есть блок "Самых популярных товаров", выводится так:

<h1>Самые популярные товары</h1>
    <div>
        {products count=8 filter=[ sort => $smarty.const.SORT_PRODUCTS_MODE_BY_BROWSED|default:0,
                                   sort_direction => 1 ] assign=items}
        {if !empty($items)}
            {foreach $items as $item}
                {include 'common/product-card.htm'}
            {/foreach}
        {/if}

1. Каким образом можно заменить сортировку для выборки случайных товаров? Нужно что-то похожее на "SORT_ORDER_BY_RAND()", или что-то более интересное вида: 1. сгенерировали случаных ID товаров среди существующих, сделали выборку, и отобразили её на странице.

2. Где можно посмотреть описание функции {products... с входными параметрами?

Прошу подсказать решение вопроса.

Спасибо.

16:23
20 янв
#
написал:

Исходный код функции products смотрите в файле /objects/.any-models/SmartyTags.php.

Вот один из возможных вариантов решения: взять 1000 первых товаров (по алфавиту), из них отобрать 15 случайных.

{products count=1000 filter=[ randomcount => 15 ] assign=items}
12:39
25 янв
#
?
написал:

На карточке товара, шаблон design\template\html\product.htm сделано так, что цена выводится тогда, когда количество товара больше нуля:

{if $product->variants[0]->stock > 0} 1 000 руб. {/if}

Каким образом можно добавить данное условие в filter так, чтобы выводилось 15 случайных товаров, у которых товар->variants[0]->stock > 0?

Есть ли где-нибудь справочный материал по функциям, или список часто задаваемых вопросов, или примеры типичных реализаций? Очень много возникает простых типовых вопросов. Если такого раздела нет, предлагаю создать.

21:06
30 янв
#
?
написал:

Ещё раз поднимаю вышеописанный вопрос.

В файле objects/.any-models/SmartyTags.php в функции products находится строка получения выборки товаров:

$this->cms->db->products->get($items, $filter);

Где можно посмотреть исходный код функции get? Есть ли пример функции, описанный в helper, для получения собственной/custom выборки товаров?

Например, хочу получить массив id всех товаров, потом среди них выбрать 15 случайных и сделать выборку товаров с заданными id. Или хочу создать свой запрос на выборку товаров, отсортированных определённым образом, например, получить 20 случайных товаров, но таких, у которых поле "stock" > 0.

21:41
30 янв
#
написал:

Код функции get и перечень параметров её фильтра смотрите в файле objects/.db-models/Products.php. В этой папке собраны разные модели таблиц базы данных, общедоступные методы которых могут быть вызваны по принципу:

$this->cms->db->модель_таблицы->имя_метода(...);
23:58
30 янв
#
?
написал:

Сколько будет стоить написание для helper (чтобы при обновлении движка ничего не поломалось) такой функции?

{random_products count=8 cats='' assign=items}

Функция получает id всех товаров, выбирает count случайных, записывает в items данные товаров так, чтобы их можно было вывести аналогично шаблону в первом сообщении. Если задан параметр cats - одна или более категорий, то выборка идёт среди всех товаров указанных категорий.

Или другой вариант/принцип работы функции но такой, чтобы:

  • 1. работала максимально быстро с большим объёмом товаров
  • 2. выборка должна идти среди всех товаров, а не среди первых 120 как по умолчанию в {products...
  • 3. возможность выборки среди всех товаров заданной/заданных категорий
  • 4. учесть, что набор id может быть в виде решета, т.е. не 1,2,3,4,5,6, а например 1,4,5,6,9,11

Уточнение принципов работы функции, существенные замечания с точки зрения подхода, особенности, возможность улучшения и т.п. - для обсуждения.

11:17
31 янв
#
написал:

Пример функции 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}

Написание ответа

Перед публикацией рекомендуется использовать Предпросмотр, чтобы увидеть конечный вид сообщения.


Обратите внимание! Для противодействия спаму новые посты форума проявляются с задержкой от нескольких минут, пока не пройдут модерацию.