Jump to content

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


Go to solution Solved by Noxter,

Recommended Posts

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

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

Телефоны

Samsung

1,2,3,4,5

Apple

1,2,3,4

Huawei

1,2,3,4

 

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

Link to post
Share on other sites

Сделать то можно, но вы подумали об оптимизации? Что если в каждом из брендов будет по 100-1000 товаров?

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

Link to post
Share on other sites

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

что-то типа

 

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

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

 
Link to post
Share on other sites

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

:)

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

 

https://simplashop.com/article/universalnyj-vidzhet-get_products

 

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

Link to post
Share on other sites

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

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

 

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

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

Link to post
Share on other sites

:)

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

 

https://simplashop.com/article/universalnyj-vidzhet-get_products

 

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

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

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

 

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

Link to post
Share on other sites

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

Не решит абсолютно ничего.

По поводу плагина API https://simpla-addons.org/blog/news/obnovlenie-simpla-237-ot-21-aprelya-2015

Link to post
Share on other sites

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

получится примерно так. или так . Вставлять в 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>
Link to post
Share on other sites

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

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

Спасибо.

Link to post
Share on other sites

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

Link to post
Share on other sites

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

 

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

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

Link to post
Share on other sites

Странно, но вариант 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 категории.

Link to post
Share on other sites

 

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

 

 

{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}
Link to post
Share on other sites

Странно, но вариант 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 - другое .

Link to post
Share on other sites

{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
 

 

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...