Вывод всех товаров на главной.

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

wisma
wisma

Сообщение #1 wisma » 20.03.2017, 11:30

Добрый день, в стандартном шаблоне (cms lite) не могу понять как вывести на главной все товары? Именно все товары (без сортировки по тем-же категориям, удобность для посетителей сразу видеть товар...)

OkayCMS M
Администратор
Аватара
OkayCMS M
Администратор
Репутация: 216
Сообщения: 1627
Зарегистрирован: 12.11.2015
С нами: 8 лет 5 месяцев
Сайт Skype

Сообщение #2 OkayCMS » 20.03.2017, 16:17

Если у вас таких товаров немного, то отметьте все рекомендуемыми и они выведутся на главную. Это легкий способ без доработок CMS.

wisma
wisma

Сообщение #3 wisma » 20.03.2017, 22:15

У меня до 30 товаров, но... Есть отдельно рекомендуемые, поэтому нужно именно вывод всех товаров. Такая функция есть во многих движдак, я удивился что у вас нету вывода всех товаров...

m1hasik M
Аватара
m1hasik M
Возраст: 32
Репутация: 31
Сообщения: 200
Зарегистрирован: 12.11.2015
С нами: 8 лет 5 месяцев
Откуда: Днепр
Skype

Сообщение #4 m1hasik » 21.03.2017, 08:12

идем в файл view/View.php
и добавляем строку

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

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

после строки

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

$this->design->smarty->registerPlugin("function", "get_banner",                 array($this, 'get_banner_plugin'));

потом идем в самый низ файла и добавляем вот такую функцию

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

public function get_products_plugin($params, &$smarty) {
        if(!isset($params['visible'])) {
            $params['visible'] = 1;
        }
        $params['in_stock'] = 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));

                // Для каждого варианта
                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);
        }
    }
 


и потом в файле main.tpl пишете
{get_products var="all_products" limit=100}

ну а дальше вывод товаров, как например у тех же рекомендуемых

wisma
wisma

Сообщение #5 wisma » 21.03.2017, 10:27

в версии Lite 1.2.3. не нашел такой функции

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

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


Поэтому добавил в строку в конец всех функций (до кавычек) и вышло вот так...

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

 // Настраиваем плагины для смарти
            $this->design->smarty->registerPlugin('modifier', 'printa',                     array($this, 'printa'));
            $this->design->smarty->registerPlugin("function", "get_posts",               array($this, 'get_posts_plugin'));
            $this->design->smarty->registerPlugin("function", "get_brands",               array($this, 'get_brands_plugin'));
            $this->design->smarty->registerPlugin("function", "get_browsed_products",      array($this, 'get_browsed_products'));
            $this->design->smarty->registerPlugin("function", "get_featured_products",      array($this, 'get_featured_products_plugin'));
            $this->design->smarty->registerPlugin("function", "get_new_products",         array($this, 'get_new_products_plugin'));
            $this->design->smarty->registerPlugin("function", "get_discounted_products",   array($this, 'get_discounted_products_plugin'));
            $this->design->smarty->registerPlugin("function", "get_categories",             array($this, 'get_categories_plugin'));
       $this->design->smarty->registerPlugin("function", "get_banner",                 array($this, 'get_banner_plugin'));   
$this->design->smarty->registerPlugin("function", "get_products",                 array($this, 'get_products_plugin'));
  }
    }


После чего добавление самой функции в конец viev.php выбило ошибку, методом логики и тыка добавил после

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

    public function get_browsed_products($params, &$smarty) {
        if(!empty($_COOKIE['browsed_products'])) {
            $browsed_products_ids = explode(',', $_COOKIE['browsed_products']);
            $browsed_products_ids = array_reverse($browsed_products_ids);
            if(isset($params['limit'])) {
                $browsed_products_ids = array_slice($browsed_products_ids, 0, $params['limit']);
            }
           
            $products = array();
            foreach($this->products->get_products(array('id'=>$browsed_products_ids, 'visible'=>1)) as $p) {
                $products[$p->id] = $p;
            }
           
            $browsed_products_images = $this->products->get_images(array('product_id'=>$browsed_products_ids));
            foreach($browsed_products_images as $browsed_product_image) {
                if(isset($products[$browsed_product_image->product_id])) {
                    $products[$browsed_product_image->product_id]->images[] = $browsed_product_image;
                }
            }
           
            foreach($browsed_products_ids as $id) {
                if(isset($products[$id])) {
                    if(isset($products[$id]->images[0])) {
                        $products[$id]->image = $products[$id]->images[0];
                    }
                    $result[] = $products[$id];
                }
            }
            $smarty->assign($params['var'], $result);
        }
    }



Ваш код:

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

    public function get_products_plugin($params, &$smarty) {
        if(!isset($params['visible'])) {
            $params['visible'] = 1;
        }
        $params['in_stock'] = 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));

                // Для каждого варианта
                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);
        }
    }
 



Ну и в шаблоне вывел по типу Акций

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

{* Вывод всех товаров (выводится только те у которых есть цена *}
{get_products var="all_products" limit=100}
{if $all_products}
   <div class="border-b-1-info p-y-1">
      <div class="container">
         {* Заголовок блока *}
         <div class="h1 m-b-1">
            <span data-language="{$translate_id['main_all_products']}">{$lang->main_all_products}</span>
         </div>

         <div class="row">
            {foreach $all_products as $product}
               <div class="col-md-4 col-xl-3">
                  {include "tiny_products.tpl"}
               </div>
               {if $product@iteration % 3 == 0}<div class="col-xs-12 hidden-sm-down hidden-xl-up"></div>{/if}
            {/foreach}
         </div>
      </div>
   </div>
{/if}



И все вывелось и заработало, спасибо!

m1hasik M
Аватара
m1hasik M
Возраст: 32
Репутация: 31
Сообщения: 200
Зарегистрирован: 12.11.2015
С нами: 8 лет 5 месяцев
Откуда: Днепр
Skype

Сообщение #6 m1hasik » 21.03.2017, 10:29

Хорошо что заработало, только выводите не слишком много товаров на главную, а то тяжелая страница будет

wisma
wisma

Сообщение #7 wisma » 21.03.2017, 11:32

Этот вариант как раз для меня, у меня товаров всего 24~.


Спасибо еще раз!)

Думаю многим это пригодится.


Название раздела: Вопросы по работе с OkayCMS
Правила раздела: faq.php?mode=okay

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


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

   

Вернуться в «Вопросы по работе с OkayCMS»

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

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