Универсальный виджет 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!

Несколько полезностей для Simpla 2.x... Переносим выбор варианта оплаты на первую страницу оформления заказа Автоматически создаваемый артикул как ID товара Выбор количества товара перед п...
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...
Вывод всех товаров категории на странице товара. S... открываем view/View.php регистрируем функцию: $this->design->smarty->registerPlugin("function", "get_products", array($this, 'get_products_p...
Выгружаем в Яндекс Маркет только первый вариант то... Иногда необходимо выгружать в Яндекс Маркет только первый вариант товара. Данное решение поможет решить эту задачу. Открываем файл yandex.php, ище...

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