question Posted February 27, 2019 Report Share Posted February 27, 2019 Кто сталкивался, как делали?Есть необходимость вывода, например, телефонов в таком видеТелефоныSamsung1,2,3,4,5Apple1,2,3,4Huawei1,2,3,4 Сделать вложенный цикл... но как быть, если, например, на сайте присутствует бренд Zelmer без телефонов? Вообще не понимаю, с какой стороны к этой задаче подойти. Quote Link to post Share on other sites
Noxter Posted February 27, 2019 Report Share Posted February 27, 2019 Сделать то можно, но вы подумали об оптимизации? Что если в каждом из брендов будет по 100-1000 товаров? Выбираете бренды, потом формируете массив ID-шек брендов, далее выбираете товары по этим ID ($filter['brand_id'] = $ids) брендов, после формируете новый массив где связка будет ID бренда с brand_id поля в товаре. Quote Link to post Share on other sites
question Posted February 27, 2019 Author Report Share Posted February 27, 2019 Мне бы для начала решение без оптимизации, чисто на уровне шаблона. что-то типа {foreach $products as $product} {foreach $brands as $brand} {if... {/foreach}{/foreach} посмотрю, как быстро этот код выполняется и сколько ресурсов ест... Quote Link to post Share on other sites
Noxter Posted February 27, 2019 Report Share Posted February 27, 2019 Такое делать на уровне шаблона всё-равно что танк одному толкать... Quote Link to post Share on other sites
question Posted February 27, 2019 Author Report Share Posted February 27, 2019 Это понятно. Весь вопрос - как танк одному толкать? Quote Link to post Share on other sites
Kami Posted February 27, 2019 Report Share Posted February 27, 2019 Это понятно. Весь вопрос - как танк одному толкать? ну если хотите танк толкать , то вот вам универсальный виджет сделали. https://simplashop.com/article/universalnyj-vidzhet-get_products В принципе решение может натолкнуть вас на мысль. Quote Link to post Share on other sites
question Posted February 27, 2019 Author Report Share Posted February 27, 2019 По-моему, это то, что нужно.А список брендов категории так выводится? {foreach $category->brands as $brand} {$brand->name} {$foreach} Написал ради того, чтобы не забыть завтра проверить. Quote Link to post Share on other sites
Noxter Posted February 27, 2019 Report Share Posted February 27, 2019 ну если хотите танк толкать , то вот вам универсальный виджет сделали. https://simplashop.com/article/universalnyj-vidzhet-get_products В принципе решение может натолкнуть вас на мысль.Это не то что нужно, не решит задачи. Мало того в симпле есть универсальный плагин для доступа к API. Quote Link to post Share on other sites
Kami Posted February 27, 2019 Report Share Posted February 27, 2019 Это не то что нужно, не решит задачи. Мало того в симпле есть универсальный плагин для доступа к API. из коробки? что за универсальный плагин? Ну почему не решит, как костыльный метод сойдет) ТС же просил танк толкать. Quote Link to post Share on other sites
Noxter Posted February 27, 2019 Report Share Posted February 27, 2019 из коробки? что за универсальный плагин? Ну почему не решит, как костыльный метод сойдет) ТС же просил танк толкать.Не решит абсолютно ничего.По поводу плагина API https://simpla-addons.org/blog/news/obnovlenie-simpla-237-ot-21-aprelya-2015 Quote Link to post Share on other sites
ST_RU Posted February 28, 2019 Report Share Posted February 28, 2019 На уровне шаблона толкаем танк. Пример без изысков и проверок в коде. просто вывод.получится примерно так. или так . Вставлять в 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> Quote Link to post Share on other sites
question Posted February 28, 2019 Author Report Share Posted February 28, 2019 Ребята, я и не просил готовое решение. Просто чтобы направили в нужное русло.Сейчас буду проверять свою и вашу версию, посмотрю, сильно ли вырастет нагрузка. А вообще у меня такое пофигистическое отношение к задаче потому что на сайте реализовано кеширование и даже если время генерации страницы составит немыслимых 1 секунду, то второй и последующие разы эта страница будет выводиться из кеша, понадобится около 5-7 мсек на ssd-хостинге.Спасибо. Quote Link to post Share on other sites
question Posted February 28, 2019 Author Report Share Posted February 28, 2019 Я уже поднимал тему о кешировании. Сделать его очень просто, в моём случае на диске сохраняется вывод всех товаров со всеми сортировками и прочими параметрами, которые когда-либо запрашивал пользователь, в итоге нагрузка на БД равна 0.1% от лимита самого дешёвого хостинга при запросе 1000 страниц в сутки. Корзина, комментарии и прочие динамические страницы - отдельный разговор. И да, кеш живёт до изменения цен или описания (удаляю руками). Quote Link to post Share on other sites
question Posted February 28, 2019 Author Report Share Posted February 28, 2019 Попробовал свой вариант {foreach $category->brands as $b} <h2>{$b->name}</h2> {foreach $products as $p} {if $p->brand == $b} {$p->name}<br/> {/if} {/foreach} {/foreach} Не работает. Думаю, причина в том, что у товара нет свойства "бренд" (нет в селекте соответствующего запроса). Quote Link to post Share on other sites
question Posted February 28, 2019 Author Report Share Posted February 28, 2019 Странно, но вариант 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 категории. Quote Link to post Share on other sites
Noxter Posted February 28, 2019 Report Share Posted February 28, 2019 Попробовал свой вариант {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} Quote Link to post Share on other sites
ST_RU Posted February 28, 2019 Report Share Posted February 28, 2019 Странно, но вариант 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 - другое . Quote Link to post Share on other sites
question Posted February 28, 2019 Author Report Share Posted February 28, 2019 {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 , но в каком файле искать этот запрос? Quote Link to post Share on other sites
Solution Noxter Posted February 28, 2019 Solution Report Share Posted February 28, 2019 api/Brands.php Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.