verdano Опубликовано 6 сентября, 2022 Жалоба Поделиться Опубликовано 6 сентября, 2022 (изменено) Выкладываю решение, может кому полезно будет. Суть решения: Если категории не задано изображение в админке, то изображение берется из товара внутри этой категории. Если у первого товара нет картинки, то проверка второго и так далее до первого товара с картинкой. Если у всех товаров внутри категории нет картинки, то выводится просто картинка paceholder.jpg (заглушка) Редактируем файл ProductsView.php (вставляем кусок кода в любое место) $query = "SELECT p.id, i.filename, c.category_id FROM __products p LEFT JOIN __images i ON p.id = i.product_id LEFT JOIN __products_categories c ON p.id = c.product_id "; $query = $this->db->placehold($query); $this->db->query($query); $cats_image = $this->db->results(); $this->design->assign('cats_image', $cats_image); Далее в шаблоне вывода товаров (у меня там над товарами выводятся подкатегории) прогоняем полученный массив объектов и выводим нужные картинки для подкатегорий, у меня это отдельный файл шаблона, но по умолчанию это было бы в файле шаблона products.tpl {function name=categories_tree_2 level=0} <ul class="ul_podkat"> {foreach $categories as $c} {if $level!=0 && $c->parent_id == $category->id} {if $c->image} <li> <a href="catalog/{$c->url}"> <img src="/files/categories/{$c->image}"> <span>{$c->name}</span> </a> </li> {else} <li> <a href="catalog/{$c->url}"> {foreach $cats_image as $c_image} {if $c->id != $c_image->category_id} {else} {if $c_image->filename!=""} <img src="{$c_image->filename|resize:128:128}"> {break} {else} <img src="/design/{$settings->theme|escape}/images/placeholder.png"> {/if} {break} {/if} {/foreach} <span>{$c->name}</span> </a> </li> {/if} {/if} {if $c->subcategories} {categories_tree_2 categories=$c->subcategories level=$level+1} {/if} {/foreach} </ul> {/function} Вот как-то так получилось Изменено 6 сентября, 2022 пользователем verdano Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 6 сентября, 2022 Жалоба Поделиться Опубликовано 6 сентября, 2022 Как упражнение для начинающего осваивать Simpla это годится. Но как разработка для внедрения, это ниже всякой критики. 1. Сам запрос получает данные по ВСЕМ товарам, категориям, фото. 2. Если, к примеру, на сайте 20 категорий, 50 товаров в категории, 4 фото у товара, то запрос будет извлекать 4000 записей, их которых реально нужны только 20. 3. Для сайтов с большим числом товаров возникает риск больших тормозов вплоть до полного зависания. 4. И сама логика не без недостатков. Например, если непосредственно в категории товаров нет, но они есть в подкатегориях, то предлагаемый способ не сформирует картинку для категории. 5. В шаблоне для каждой категории работает цикл {foreach $cats_image as $c_image} ... {/foreach}, что опять таки крайне нерационально, и может добавить тормоза к описанным ранее. А с учетом п.4 с большой вероятностью в цикле будут встречаться категории, для которых цикл безрезультатно проработает до конца. 6. И вывод в шаблоне неверный - для каждой категории выводится, вообще говоря, несколько картинок /images/placeholder.png. Что делать? 7. Простое применение GROUP BY в запросе могло бы улучшить ситуацию. 8. Также в запросе полезно было бы использовать INNER JOIN вместо LEFT JOIN. 9. Результаты запроса надо бы обработать в PHP и в шаблон передавать только небольшой объем действительно нужных данных. А лучше всего было бы 10. Вместо предложенного написать обработку, которая проверяет картинки категорий и добавляет в категорию, если надо, картинку из товара. Обработку достаточно запустить один раз (или изредка время от времени), а дальше все работало бы штатно без выкрутасов. Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.