Перейти к содержимому


Фото
- - - - -

Группировка по брендам в products.tpl


Best Answer Noxter , 28.02.2019 - 11:28

api/Brands.php Перейти к посту


  • Чтобы отвечать, сперва войдите на форум
18 ответов в теме

#1 question

question
  • Пользователь
  • 267 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 27.02.2019 - 20:32

Кто сталкивался, как делали?

Есть необходимость вывода, например, телефонов в таком виде

Телефоны

Samsung

1,2,3,4,5

Apple

1,2,3,4

Huawei

1,2,3,4

 

Сделать вложенный цикл... но как быть, если, например, на сайте присутствует бренд Zelmer без телефонов? Вообще не понимаю, с какой стороны к этой задаче подойти.



#2 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 7 075 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 27.02.2019 - 20:59

Сделать то можно, но вы подумали об оптимизации? Что если в каждом из брендов будет по 100-1000 товаров?
Выбираете бренды, потом формируете массив ID-шек брендов, далее выбираете товары по этим ID ($filter['brand_id'] = $ids) брендов, после формируете новый массив где связка будет ID бренда с brand_id поля в товаре.

#3 question

question
  • Пользователь
  • 267 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 27.02.2019 - 21:49

Мне бы для начала решение без оптимизации, чисто на уровне шаблона. 

что-то типа

 

{foreach $products as $product}
{foreach $brands as $brand}
{if...
{/foreach}{/foreach}
 

посмотрю, как быстро этот код выполняется и сколько ресурсов ест...

 


#4 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 7 075 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 27.02.2019 - 21:58

Такое делать на уровне шаблона всё-равно что танк одному толкать...

#5 question

question
  • Пользователь
  • 267 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 27.02.2019 - 22:35

Это понятно. Весь вопрос - как танк одному толкать?



#6 Kami

Kami
  • Пользователь
  • 305 сообщений
  • Откуда:Россия

Опубликовано 27.02.2019 - 23:01

Это понятно. Весь вопрос - как танк одному толкать?

:)

ну если хотите танк толкать , то вот вам универсальный виджет сделали.

 

https://simplashop.c...et-get_products

 

В принципе решение может натолкнуть вас на мысль.



#7 question

question
  • Пользователь
  • 267 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 27.02.2019 - 23:04

По-моему, это то, что нужно.

А список брендов категории так выводится?

 

{foreach $category->brands as $brand}
{$brand->name}
{$foreach}
 

Написал ради того, чтобы не забыть завтра проверить.



#8 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 7 075 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 27.02.2019 - 23:04

:)
ну если хотите танк толкать , то вот вам универсальный виджет сделали.

https://simplashop.c...et-get_products

В принципе решение может натолкнуть вас на мысль.

Это не то что нужно, не решит задачи. Мало того в симпле есть универсальный плагин для доступа к API.

#9 Kami

Kami
  • Пользователь
  • 305 сообщений
  • Откуда:Россия

Опубликовано 27.02.2019 - 23:06

Это не то что нужно, не решит задачи. Мало того в симпле есть универсальный плагин для доступа к API.

 

из коробки? что за универсальный плагин? Ну почему не решит, как костыльный метод сойдет) ТС же просил танк толкать. 



#10 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 7 075 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 27.02.2019 - 23:59

из коробки? что за универсальный плагин? Ну почему не решит, как костыльный метод сойдет) ТС же просил танк толкать.

Не решит абсолютно ничего.
По поводу плагина API https://simpla-addon...21-aprelya-2015

#11 ST_RU

ST_RU

    Главный по шаблонам

  • Фрилансер
  • 806 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Siberia, Nsk

Опубликовано 28.02.2019 - 06:22

На уровне шаблона толкаем танк. Пример без изысков и проверок в коде. просто вывод.

получится примерно так. или так . Вставлять в products.tpl

Товары в прокрутки можно сделать, чтобы всегда было в 1 линию

{$brands_max = 3}    {* Максимум брендов в этом списке *}
{$brands_count = 0}  {* счетчик старт *}
<div style="margin: 0 0 10vw;">
  {foreach $category->brands as $b}
    <h3>{$category->name} {$b->name}</h3>

    {get_new_products var=new_products limit=10 brand_id=$b->id category_id=$category->id}
    {if $new_products}
    {foreach $new_products as $product}
      <h5><a data-product="{$product->id}" href="products/{$product->url}">{$product->name|escape}</a></h5>
    {/foreach}
    <a style="display: block; margin: 7px 0; color: red" href='catalog/{$category->url}/{$b->url}'><b>показать все {$category->name} {$b->name}</b></a>
    {/if}
    <hr>
    
    {* Если счётчик достиг $brands_max , обрываем *}
    {$brands_count = $brands_count + 1}
    {if $brands_count == $brands_max}{break}{/if}    
  
  {/foreach}
</div>


#12 question

question
  • Пользователь
  • 267 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 28.02.2019 - 10:31

Ребята, я и не просил готовое решение. Просто чтобы направили в нужное русло.

Сейчас буду проверять свою и вашу версию, посмотрю, сильно ли вырастет нагрузка. А вообще у меня такое пофигистическое отношение к задаче потому что на сайте реализовано кеширование и даже если время генерации страницы составит немыслимых 1 секунду, то второй и последующие разы эта страница будет выводиться из кеша, понадобится около 5-7 мсек на ssd-хостинге.

Спасибо.



#13 question

question
  • Пользователь
  • 267 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 28.02.2019 - 10:35

Я уже поднимал тему о кешировании. Сделать его очень просто, в моём случае на диске сохраняется вывод всех товаров со всеми сортировками и прочими параметрами, которые когда-либо запрашивал пользователь, в итоге нагрузка на БД равна 0.1% от лимита самого дешёвого хостинга при запросе 1000 страниц в сутки. Корзина, комментарии и прочие динамические страницы - отдельный разговор. И да, кеш живёт до изменения цен или описания (удаляю руками).



#14 question

question
  • Пользователь
  • 267 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 28.02.2019 - 10:53

Попробовал свой вариант

 

{foreach $category->brands as $b}
    <h2>{$b->name}</h2>
    {foreach $products as $p}
        {if $p->brand == $b}
            {$p->name}<br/>
        {/if}
    {/foreach}
{/foreach}
 

Не работает. Думаю, причина в том, что у товара нет свойства "бренд" (нет в селекте соответствующего запроса).



#15 question

question
  • Пользователь
  • 267 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 28.02.2019 - 11:04

Странно, но вариант ST_RU (упростил до такого)

 

{foreach $category->brands as $b}
    <h2>{$b->name}</h2>
    {get_new_products var=new_products brand_id=$b->id}
    {if $new_products}
        {foreach $new_products as $p}
            {$p->name}<br/>
        {/foreach}
    {/if}
{/foreach}
 

 

Выводит товары нужных брендов, но абсолютно всех категорий. Подскажите, как в get_new_products добавить id категории.



#16 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 7 075 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 28.02.2019 - 11:04


Попробовал свой вариант

{foreach $category->brands as $b}
	<h2>{$b->name}</h2>
	{foreach $products as $p}
		{if $p->brand == $b}
			{$p->name}<br/>
		{/if}
	{/foreach}
{/foreach}
Не работает. Думаю, причина в том, что у товара нет свойства "бренд" (нет в селекте соответствующего запроса).
{if $p->brand == $b->name}
{$p->name}<br/>
{/if}


#17 ST_RU

ST_RU

    Главный по шаблонам

  • Фрилансер
  • 806 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Siberia, Nsk

Опубликовано 28.02.2019 - 11:07

Странно, но вариант ST_RU (упростил до такого)

 

{foreach $category->brands as $b}
    <h2>{$b->name}</h2>
    {get_new_products var=new_products brand_id=$b->id}
    {if $new_products}
        {foreach $new_products as $p}
            {$p->name}<br/>
        {/foreach}
    {/if}
{/foreach}
 

 

Выводит товары нужных брендов, но абсолютно всех категорий. Подскажите, как в get_new_products добавить id категории.

 

{get_new_products var=new_products limit=10 brand_id=$b->id category_id=$category->id}

 

но все равно. такой вывод через шаблон не идеальный.

это просто пример, который можно использовать. вместо готового get_new_products - другое .



#18 question

question
  • Пользователь
  • 267 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 28.02.2019 - 11:22

{get_new_products var=new_products limit=10 brand_id=$b->id category_id=$category->id}

 

но все равно. такой вывод через шаблон не идеальный.

это просто пример, который можно использовать. вместо готового get_new_products - другое .

Попробовал, работает на ура.

 

{foreach $category->brands as $b}
    <h2>{$b->name}</h2>
    {get_new_products var=new_products category_id=$category->id brand_id=$b->id}
    {if $new_products}
        {foreach $new_products as $p}
            {$p->name}<br/>
        {/foreach}
    {/if}
{/foreach}
 

Генерация страницы занимает от 60 до 90 мсек. Это не похоже на толкание танка. Одна проблема: бренды расположены по алфавиту, а не по их id. Понимаю, что в sql запросе стоит 

 

order by b.name
 

 

, который нужно исправить на 

 

order by b.id
 

 

, но в каком файле искать этот запрос?



#19 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 7 075 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 28.02.2019 - 11:28   Best Answer

api/Brands.php




0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых