Универсальный виджет get_products. Simpla CMS

Универсальный виджет get_products. Simpla CMS

Порой есть необходимость получить список товаров по какому-то определенному критерию, будь-то товары схожего бренда в карточке товаров, или новинки конкретной категории или бренда. Сделаем небольшой универсальный виджет для SimplaCMS, который позволит выбирать товары «напрямую». Правда надо будет запомнить небольшой набор параметров, которые можно передавать в виджет, чтобы набор выбранного товара был корректен.

Как и все виджеты в SimplaCMS мы добавим наш в файл view/View.php. После кода (~100 строка)

$this->design->smarty->registerPlugin("function", "get_discounted_products", array($this, 'get_discounted_products_plugin'));

добавим вызов нашего нового виджета

$this->design->smarty->registerPlugin("function", "get_products", array($this, 'get_products_plugin'));

Теперь проще всего скопировать и модифицировать метод get_discounted_products_plugin, но я приведу уже готовый код — в конец файл перед закрывающей } добавим наш говый метод, который мы вызвали выше

public function get_products_plugin($params, &$smarty)
{
    if(!isset($params['visible']))
        $params['visible'] = 1;
    if(!empty($params['var']))
    {
        foreach($this->products->get_products($params) as $p)
            $products[$p->id] = $p;
 
        if(!empty($products))
        {
            // id выбраных товаров
            $products_ids = array_keys($products);
     
            // Выбираем варианты товаров
            $variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'in_stock'=>true));
             
            // Для каждого варианта
            foreach($variants as &$variant)
            {
                // добавляем вариант в соответствующий товар
                $products[$variant->product_id]->variants[] = $variant;
            }
             
            // Выбираем изображения товаров
            $images = $this->products->get_images(array('product_id'=>$products_ids));
            foreach($images as $image)
                $products[$image->product_id]->images[] = $image;
 
            foreach($products as &$product)
            {
                if(isset($product->variants[]))
                    $product->variant = $product->variants[];
                if(isset($product->images[]))
                    $product->image = $product->images[];
            }              
        }
 
        $smarty->assign($params['var'], $products);
         
    }
}

Поскольку мы делаем плагин для клиентской части, то оставим $params[‘visible’], чтобы не выводились скрытые товары. С задачей закончили 🙂 В любом файле шаблона теперь можем вызвать наш виджет по аналогии с тем, как выбираются новинки, например

{get_products var=all_products limit=3}
{if $all_products}
{foreach $all_products as $p}
//выводим товар в цикле
{/foreach}
{/if}

В приведенном виде в массиве $all_products будет выбрано 3 первых товара, отсортированных по-умолчанию. Но поскольку это не очень интерено, то привожу список какие наборы товаров мы может получить, причем в различных комбинация. Итак, параметры и их значения

Читайте также  Вывод всех товаров категории на странице товара. Simpla.

limit с числовым значение указывает какое количество товара долно быть в выборке
discounted — передав данный параметр со значение 1 мы получим товары со скидкой
featured со значение 1 вернет рекомендуемые товары
sort может принимать 4 значения — name, created, position и price — вернет товары в той сортировке, которую указали
in_stock со значением 1 указывает, что надо только те товары, которые есть в наличии
brand_id с числовым индексом бренда вернет товары указанного бренда
category_id с числовым индексом категории вернет товары указанной категории
keyword со значение к примеру «Samsung» вернет товары где в названии или META встречается указанное слово (поиск по названию)
Первый limit можно сказать основной параметр, т.к. ограничивает нашу выборку.

Последующие 3 — это общий случай стандартных виждетов get_discounted_products, get_featured_products и get_new_products соответственно.

brand_id и category_id в-принципе то, ради чего все и затевалось.

Теперь приведу несколько примеров использования плагина.

Задача 1: вывести максимум 5 новинки того же бренда, что и указанный в карточке товара

{get_products var=brand_products brand_id=$product->brand_id sort='created' limit=5}
{if $brand_products}
{foreach $brand_products as $p}
//выводим товар в цикле
{/foreach}
{/if}

Поскольку в SimplaCMS данные товара указаны в объекте $product, то мы и передаем его значение в наш виджет.

Читайте также  Указываем телефон в настройках Simpla

Задача 1.2: вывести 4 товара той же категории, что и указанной в карточке товара

{get_products var=cat_products category->id limit=5}
{if $cat_products}
{foreach $cat_products as $p}
//выводим товар в цикле
{/foreach}
{/if}

Поскольку в SimplaCMS данные товара указаны в объекте $product, то мы и передаем его значение в наш виджет.

Задача 2: вывести 3 товара со скидкой, которые есть в наличии

{get_products var=cat_products category_id=$category->id discounted=1 in_stock=1 limit=3}
{if $cat_products}
{foreach $cat_products as $p}
//выводим товар в цикле
{/foreach}
{/if}

Задача 3: вывести на главной по 4 рекомендуемых товара каждой «верхней» категории

{foreach $categories as $c}
{if $c->visible}{get_products var=cat_products category_id=$c->id featured=1 limit=4}
{if $cat_products}
<h3>{$c->name}</h3>
{foreach $cat_products as $p}
//выводим товар в цикле
{/foreach}{*foreach $cat_products as $p*}
{/if}{*if $cat_products*}
{/if}{*if $c->visible*}
{/foreach}{*foreach $categories as $c*}

Вот и все на сегодня. Удачи в работе с SimplaCMS!

Вывод всех товаров категории на странице товара. S... открываем view/View.php регистрируем функцию: $this->design->smarty->registerPlugin("function", "get_products", array($this, 'get_products_p...
Показываем цену товара в другой валюте Simpla... Иногда необходимо вывести цену товара в другой валюте по текущему курсу. Приступим. Открываем файл product.tpl вашего шаблона, ищем и...
Указываем телефон в настройках Simpla... Намного удобнее указывать телефон только в одном месте, ведь если номер поменяется — удобнее поменять только в настройках в админке, че...
CSS Styling Radio Button and Checkboxes The idea is simple. We want to change the look and feel of existing radio buttons into more of a push button. The above image pretty much t...

Сохрани, чтобы не потерять