Вывод товаров категории на главной

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

transinffo
transinffo
Репутация: 3
Сообщения: 9
Зарегистрирован: 02.09.2017
С нами: 6 лет 6 месяцев

Сообщение #1 transinffo » 20.09.2017, 18:53

Всем привет.

Тз:
1. okaycms 2.1 lite шаблон stok.
2. Вывести товары определенной категории на главной странице.

Решение взято здесь.

1. \view\View.php в части // Настраиваем плагины для смарти добавим наш:

Код: Выделить всё

/*Универсальный виджет для товаров*/
$this->design->smarty->registerPlugin("function", "get_products",               array($this, 'get_products_plugin'));

далее под:

Код: Выделить всё

    function fetch() {
        return false;
    }

добавим:

Код: Выделить всё

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[0]))
               $product->variant = $product->variants[0];
            if(isset($product->images[0]))
               $product->image = $product->images[0];
         }            
      }
      $smarty->assign($params['var'], $products);         
   }
}


2. \design\stok_1\html\main.tpl - в шаблон для главной добавим такое:

Код: Выделить всё

{get_products var=custom_products category_id=29 limit=20}
{if $custom_products}
<!-- Список товаров-->
<div id="fn-products_content" class="row gridBlock">
    {foreach $custom_products as $product}
   <!-- Товар -->
    <div class="col-xs-12 col-md-4 col-lg-4 col-xl-3 product">
       <div class="fn-product card  anim-all">
           <div class="card-block fn-transfer">
             {if $product->image}
            <div class="card-image image m-b-sm">
                  <img class="fn-img" src="{$product->image->filename|resize:212:212}" alt="{$product->name|escape}" title="{$product->name|escape}" style="opacity: 0.96;">      
                <a class="fn-zoom over-all" href="products/{$product->url}"></a>
            </div>
                {/if}

      
            <h3 class="card-title m-a-0 p-x-sm" data-product="{$product->variant->id}">
               <a href="/products/{$product->url}">{$product->name|escape}</a>
            </h3>


      
            <div class="row m-x-0 card-price price">
               <div class="col-xs-12">
                  <span class="fn-price">{$product->variant->price|convert}</span> {$currency->sign|escape}
               </div>
            </div>

            <form class="fn-variants okaycms" action="/cart">
                  <div class="input-group btn-group">                            
                     <button class="btn ico-btn_cart fn-is_stock" title="Купить" data-language="tiny_products_add_cart" type="submit"></button>
                        <a class="btn ico-btn_compare fn-comparison okaycms" href="#" title="В сравнение" data-result-text="Из сравнения" data-id="{$product->variant->id}"></a>
                        <a href="#" class="btn ico-btn_wishlist fn-wishlist okaycms" data-id="{$product->variant->id}" title="В закладки" data-result-text="Из закладок"></a>
                  </div>
                  <select name="variant" class="hidden fn-variant okaycms form-control c-select hidden-xs-up">
                        <option value="{$product->variant->id}" data-price="{$product->variant->price|convert}" data-stock="50" selected="selected">{$product->name|escape}</option>
                  </select>
            </form>

               <div class="product-labels">
               </div>
          </div>
       </div>
   </div>
   <!-- Товар (The End) -->
   {/foreach}   
</div>
<!-- Список товаров (The End) -->
{/if}


в category_id пишем id нужной категории. Наслаждаемся.

AlexusTdV
AlexusTdV
Репутация: 0
Сообщения: 27
Зарегистрирован: 29.05.2017
С нами: 6 лет 9 месяцев

Сообщение #2 AlexusTdV » 11.12.2017, 12:46

Не работает. при добавлении
"$this->design->smarty->registerPlugin("function", "get_products", array($this, 'get_products_plugin'));"
Ошибка 500

wisma
wisma
Репутация: 1
Сообщения: 18
Зарегистрирован: 12.12.2017
С нами: 6 лет 3 месяца

Сообщение #3 wisma » 12.12.2017, 00:09

AlexusTdV писал(а):Не работает. при добавлении
"$this->design->smarty->registerPlugin("function", "get_products", array($this, 'get_products_plugin'));"
Ошибка 500
В инструкции вы не правильно выполнили первый пункт, написано после чего добавить

Код: Выделить всё

// Настраиваем плагины для смарти



я добавил почти в конец:

Код: Выделить всё

  /*Выборка групп баннеров*/
         $this->design->smarty->registerPlugin("function", "get_banner",                 array($this, 'get_banner_plugin'));
         /*Универсальный виджет для товаров*/
         $this->design->smarty->registerPlugin("function", "get_products",               array($this, 'get_products_plugin'));         
         /*Иницализация капчи*/
            $this->design->smarty->registerPlugin("function", "get_captcha",                array($this, 'get_captcha_plugin'));



Тестировалось на Okay pro 2.1.3 С хорошим каталогом товаров и никаких проблем.

Добавлено спустя 11 минут 8 секунд:
transinffo писал(а):Всем привет.

Тз:
1. okaycms 2.1 lite шаблон stok.
2. Вывести товары определенной категории на главной странице.

Решение взято здесь.

1. \view\View.php в части // Настраиваем плагины для смарти добавим наш:

Код: Выделить всё

/*Универсальный виджет для товаров*/
$this->design->smarty->registerPlugin("function", "get_products",               array($this, 'get_products_plugin'));

далее под:

Код: Выделить всё

    function fetch() {
        return false;
    }

добавим:

Код: Выделить всё

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[0]))
               $product->variant = $product->variants[0];
            if(isset($product->images[0]))
               $product->image = $product->images[0];
         }            
      }
      $smarty->assign($params['var'], $products);         
   }
}


2. \design\stok_1\html\main.tpl - в шаблон для главной добавим такое:

Код: Выделить всё

{get_products var=custom_products category_id=29 limit=20}
{if $custom_products}
<!-- Список товаров-->
<div id="fn-products_content" class="row gridBlock">
    {foreach $custom_products as $product}
   <!-- Товар -->
    <div class="col-xs-12 col-md-4 col-lg-4 col-xl-3 product">
       <div class="fn-product card  anim-all">
           <div class="card-block fn-transfer">
             {if $product->image}
            <div class="card-image image m-b-sm">
                  <img class="fn-img" src="{$product->image->filename|resize:212:212}" alt="{$product->name|escape}" title="{$product->name|escape}" style="opacity: 0.96;">      
                <a class="fn-zoom over-all" href="products/{$product->url}"></a>
            </div>
                {/if}

      
            <h3 class="card-title m-a-0 p-x-sm" data-product="{$product->variant->id}">
               <a href="/products/{$product->url}">{$product->name|escape}</a>
            </h3>


      
            <div class="row m-x-0 card-price price">
               <div class="col-xs-12">
                  <span class="fn-price">{$product->variant->price|convert}</span> {$currency->sign|escape}
               </div>
            </div>

            <form class="fn-variants okaycms" action="/cart">
                  <div class="input-group btn-group">                            
                     <button class="btn ico-btn_cart fn-is_stock" title="Купить" data-language="tiny_products_add_cart" type="submit"></button>
                        <a class="btn ico-btn_compare fn-comparison okaycms" href="#" title="В сравнение" data-result-text="Из сравнения" data-id="{$product->variant->id}"></a>
                        <a href="#" class="btn ico-btn_wishlist fn-wishlist okaycms" data-id="{$product->variant->id}" title="В закладки" data-result-text="Из закладок"></a>
                  </div>
                  <select name="variant" class="hidden fn-variant okaycms form-control c-select hidden-xs-up">
                        <option value="{$product->variant->id}" data-price="{$product->variant->price|convert}" data-stock="50" selected="selected">{$product->name|escape}</option>
                  </select>
            </form>

               <div class="product-labels">
               </div>
          </div>
       </div>
   </div>
   <!-- Товар (The End) -->
   {/foreach}   
</div>
<!-- Список товаров (The End) -->
{/if}


в category_id пишем id нужной категории. Наслаждаемся.


Можно еще чучуть изменив (как писал автор = универсальный плагин) вывод Новых товаров из определенной категории... ( Okay cms lite или pro 2+ )

Добавить после пункта

2. \design\stok_1\html\main.tpl - в шаблон для главной добавим такое:

Код: Выделить всё

  {get_products var=new_products category_id=25 limit=4}
{if $new_products}
<!-- Список товаров-->
<div id="fn-products_content" class="row gridBlock">
    {foreach $new_products as $product}


Вместо:

Код: Выделить всё

{get_products var=custom_products category_id=29 limit=20}
{if $custom_products}
<!-- Список товаров-->
<div id="fn-products_content" class="row gridBlock">
    {foreach $custom_products as $product}


В итоге должно выйти вот так вот: (готовый код, как вывести категории на главной в Okay cms 2+)
Шаблон Stok (под другие уже дорабатывайте сами)
{get_products var=new_products category_id=25 limit=4}
{if $new_products}
<!-- Список товаров-->
<div id="fn-products_content" class="row gridBlock">
{foreach $new_products as $product}
<!-- Товар -->
<div class="col-xs-12 col-md-4 col-lg-4 col-xl-3 product">
<div class="fn-product card anim-all">
<div class="card-block fn-transfer">
{if $product->image}
<div class="card-image image m-b-sm">
<img class="fn-img" src="{$product->image->filename|resize:212:212}" alt="{$product->name|escape}" title="{$product->name|escape}" style="opacity: 0.96;">
<a class="fn-zoom over-all" href="products/{$product->url}"></a>
</div>
{/if}


<h3 class="card-title m-a-0 p-x-sm" data-product="{$product->variant->id}">
<a href="/products/{$product->url}">{$product->name|escape}</a>
</h3>



<div class="row m-x-0 card-price price">
<div class="col-xs-12">
<span class="fn-price">{$product->variant->price|convert}</span> {$currency->sign|escape}
</div>
</div>

<form class="fn-variants okaycms" action="/cart">
<div class="input-group btn-group">
<button class="btn ico-btn_cart fn-is_stock" title="Купить" data-language="tiny_products_add_cart" type="submit"></button>
<a class="btn ico-btn_compare fn-comparison okaycms" href="#" title="В сравнение" data-result-text="Из сравнения" data-id="{$product->variant->id}"></a>
<a href="#" class="btn ico-btn_wishlist fn-wishlist okaycms" data-id="{$product->variant->id}" title="В закладки" data-result-text="Из закладок"></a>
</div>
<select name="variant" class="hidden fn-variant okaycms form-control c-select hidden-xs-up">
<option value="{$product->variant->id}" data-price="{$product->variant->price|convert}" data-stock="50" selected="selected">{$product->name|escape}</option>
</select>
</form>

<div class="product-labels">
</div>
</div>
</div>
</div>
<!-- Товар (The End) -->
{/foreach}
</div>
<!-- Список товаров (The End) -->
{/if}

Elanlar
Elanlar
Репутация: 9
Сообщения: 44
Зарегистрирован: 16.04.2018
С нами: 5 лет 11 месяцев

Сообщение #4 Elanlar » 14.10.2018, 20:19

Добрый вечер!

Код: Выделить всё

{get_products var=custom_products category_id=29 limit=20}
с помощью этого кода получаем товары только из 29-й категории. А как можно сделать так, чтобы получали все кроме 29-й?

Код: Выделить всё

{get_products var=custom_products category_id=!29 limit=20}
по идее так должно быть но не получается.

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #5 korshunov » 15.10.2018, 06:20

Elanlar писал(а):Добрый вечер!

Код: Выделить всё

{get_products var=custom_products category_id=29 limit=20}
с помощью этого кода получаем товары только из 29-й категории. А как можно сделать так, чтобы получали все кроме 29-й?

Код: Выделить всё

{get_products var=custom_products category_id=!29 limit=20}
по идее так должно быть но не получается.

Так не выйдет - идея слишком поверхностная. Надо переделывать плагин и (или) API...

zenlounge
zenlounge
Репутация: 0
Сообщения: 23
Зарегистрирован: 22.07.2022
С нами: 1 год 8 месяцев

Сообщение #6 zenlounge » 22.07.2022, 09:58

Elanlar писал(а):Добрый вечер!

Код: Выделить всё

{get_products var=custom_products category_id=29 limit=20}
с помощью этого кода получаем товары только из 29-й категории. А как можно сделать так, чтобы получали все кроме 29-й?

Код: Выделить всё

{get_products var=custom_products category_id=!29 limit=20}
по идее так должно быть но не получается.
Приветствую. А если хочу вывести все продукты, как узнать айди ?)

wisma
wisma
Репутация: 1
Сообщения: 18
Зарегистрирован: 12.12.2017
С нами: 6 лет 3 месяца

Сообщение #7 wisma » 23.08.2023, 16:42

zenlounge писал(а):
Elanlar писал(а):Добрый вечер!

Код: Выделить всё

{get_products var=custom_products category_id=29 limit=20}
с помощью этого кода получаем товары только из 29-й категории. А как можно сделать так, чтобы получали все кроме 29-й?

Код: Выделить всё

{get_products var=custom_products category_id=!29 limit=20}
по идее так должно быть но не получается.
Приветствую. А если хочу вывести все продукты, как узнать айди ?)

навести мышкой на название категории в админке и посмотреть ссылку.

Добавлено спустя 16 часов 34 минуты:
для версии Okay 4.x есть вывод всех категорий в удобном слайдере + мобильная поддержка стандартного шаблона:

viewtopic.php?f=9&t=3348


Название раздела: Полезные решения для OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Полезные решения для OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 15 гостей