Перейти к содержанию
Официальный форум поддержки Simpla

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


Перейти к решению Решено Noxter,

Рекомендуемые сообщения

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

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

Телефоны

Samsung

1,2,3,4,5

Apple

1,2,3,4

Huawei

1,2,3,4

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

что-то типа

 

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

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

 
Ссылка на сообщение
Поделиться на другие сайты

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

:)

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

Ссылка на сообщение
Поделиться на другие сайты

:)

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

 

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

 

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

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

получится примерно так. или так . Вставлять в 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>
Ссылка на сообщение
Поделиться на другие сайты

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

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

Спасибо.

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

 

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

 

 

{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}
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

{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
 

 

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

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...