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


Фото
- - - - -

Разбить товары на категории с подзаголовками


Best Answer Kami , 07.09.2018 - 12:56

Решил проблему данным способом

 

 

 {foreach $category->subcategories as $c} <!-- Находим подкатегории-->
		{if $c->visible}  <!-- Проверяем активна или нет-->
	<div class="cat_title">{$c->id}{$c->name}</div> <!-- Заголовок под категории -->
{get_products var=custom_products category_id=$c->id}  <!-- Универсальный виджет(решение форума)-->
{if $custom_products}
    {foreach $custom_products as $product}  <!-- Отбираем товары каждой под категории -->
<!-- непосредственно список товаров-->
    {/foreach}

{/if}

{/if}

{/foreach}

Интересно мнение спецов, понятно дело что пагинация не подойдет под данное решение, но если товаров много то решение следующее, задать limit в функции, например limit=10 и кнопку переходящую в под категорию.

Перейти к посту


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

#1 Kami

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

Опубликовано 06.09.2018 - 10:22

Друзья, вопрос. Есть Категория 

 

Бытовая техника, она делится на пылесосы и миксеры.

 

При переходе в бытовую технику, показываются товары и обеих категорий вперемешку. 

 

Суть задачи такова: привести к виду при переходе в бытовую технику.

 

Пылесосы:

Пылесос 1 

Пылесос 2

Пылесос 3

 

Ниже 

 

Миксеры:

Миксер 1

Миксер 2

Миксер 3

 

 

 {foreach $category->subcategories as $c}
		{if $c->visible}
					<div class="cat_title">	{$c->name}</div>
		{/if}
	{/foreach}

Вот получаем при переходе в категорию ее подкатегории, как вывести товары полученной подкатегории.



#2 phukortsin

phukortsin
  • Пользователь
  • 391 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 06.09.2018 - 10:47

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

А еще надо как-то учитывать возможные подкатегории более глубоких уровней. И может, и еще что возникнет...



#3 Kami

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

Опубликовано 06.09.2018 - 12:04

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

А еще надо как-то учитывать возможные подкатегории более глубоких уровней. И может, и еще что возникнет...

 

уточню, товар без пагинации, на одной странице. Категории 3 уровня не требуются. 



#4 DaVinci

DaVinci
  • Фрилансер
  • 1 019 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 06.09.2018 - 12:09

уточню, товар без пагинации, на одной странице. Категории 3 уровня не требуются. 

 

смысл в том что бы подтянуть для всех товаров основную категорию и выставить сортировку товаров по данной категории

 

в макете достаточно просто - при обходе сравниваем текущую категорию с категорией товаров, если не равны выводим заголовок

 

{$current_category = null}

{foreach $products as $p}

{if $current_category->id !== $p->category->id}
  {$p->category->name|escape}
  {$current_category = $p->category}
{/if}

....

{/foreach}

 

сложностей особых нет, главное что бы сортировка по категории в запросе дополняла стандартные


Изменено: DaVinci, 06.09.2018 - 12:15


#5 DaVinci

DaVinci
  • Фрилансер
  • 1 019 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 06.09.2018 - 12:17

еще вариант, если нет пагинации, взять все подкатегории и для каждой отдельно подтянуть товары.

 

И да, вы не ограничены только ProductsView. можете создавать их столько сколько угодно, или логику в них разбивать по небольшим методам и подтягивать необходимый при определенных условиях

 

к примеру 

 

if( $category->id == 1) {
   return $this->base_view();
} else {
  return $this->new_view();
}

 

в большинстве случаев просто ставят условия в одном методе на все случаи жизни. и потом в таком обилии условий сложно разобраться что к чему


Изменено: DaVinci, 06.09.2018 - 12:21


#6 Kami

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

Опубликовано 07.09.2018 - 12:36

смысл в том что бы подтянуть для всех товаров основную категорию и выставить сортировку товаров по данной категории

 

в макете достаточно просто - при обходе сравниваем текущую категорию с категорией товаров, если не равны выводим заголовок

 

{$current_category = null}

{foreach $products as $p}

{if $current_category->id !== $p->category->id}
  {$p->category->name|escape}
  {$current_category = $p->category}
{/if}

....

{/foreach}

 

сложностей особых нет, главное что бы сортировка по категории в запросе дополняла стандартные

 

 

Не совсем понял решение , 

 

я же нахожусь в категории бытовая техника , 

 

и у меня там 2 категории , Миксеры и пылесосы .

 

итого находясь на странице бытовой техники, вывод должен быть формата 

 

 

Пылесосы:

Пылесос 1 

Пылесос 2

Пылесос 3

 

Ниже 

 

Миксеры:

Миксер 1

Миксер 2

Миксер 3

 

 

То есть проверка текущей категории проблему не решит.



#7 Kami

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

Опубликовано 07.09.2018 - 12:56   Best Answer

Решил проблему данным способом

 

 

 {foreach $category->subcategories as $c} <!-- Находим подкатегории-->
		{if $c->visible}  <!-- Проверяем активна или нет-->
	<div class="cat_title">{$c->id}{$c->name}</div> <!-- Заголовок под категории -->
{get_products var=custom_products category_id=$c->id}  <!-- Универсальный виджет(решение форума)-->
{if $custom_products}
    {foreach $custom_products as $product}  <!-- Отбираем товары каждой под категории -->
<!-- непосредственно список товаров-->
    {/foreach}

{/if}

{/if}

{/foreach}

Интересно мнение спецов, понятно дело что пагинация не подойдет под данное решение, но если товаров много то решение следующее, задать limit в функции, например limit=10 и кнопку переходящую в под категорию.



#8 phukortsin

phukortsin
  • Пользователь
  • 391 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 07.09.2018 - 13:19

Если Вам подходит, то и хорошо.

А вообще, кроме вышеупомянутых, сразу видны такие недостатки:
1. Если некий товар находится в самой категории, то он выпадает из показа.
2. Если некий товар находится в двух подкатегориях, то он будет показан два раза.

#9 Kami

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

Опубликовано 07.09.2018 - 13:45

Если Вам подходит, то и хорошо.

А вообще, кроме вышеупомянутых, сразу видны такие недостатки:
1. Если некий товар находится в самой категории, то он выпадает из показа.
2. Если некий товар находится в двух подкатегориях, то он будет показан два раза.

 

ну 1 пункт это бесмыслица, если товар делится на подкатегории, то почему он должен находиться в корневой. Тут уже структуру каталога надо продумывать.

 

По второму, согласен, но если товар в 2 категориях, то и пусть показывает в двух. Это же логично.



#10 DaVinci

DaVinci
  • Фрилансер
  • 1 019 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 07.09.2018 - 14:11

ну 1 пункт это бесмыслица, если товар делится на подкатегории, то почему он должен находиться в корневой. Тут уже структуру каталога надо продумывать.

 

По второму, согласен, но если товар в 2 категориях, то и пусть показывает в двух. Это же логично.

 

вполне логично, но исключить достаточно просто -  NOT IN или по категориям или по уже запрошенным товарам



#11 phukortsin

phukortsin
  • Пользователь
  • 391 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 07.09.2018 - 14:36

ну 1 пункт это бесмыслица, если товар делится на подкатегории, то почему он должен находиться в корневой.

 

1. Товар никому ничего не должен. В админке есть возможность поместить товар как ЛЮБУЮ  категорию - как админ сочтет нужным. Если Вы никогда не помещаете в корневую, то это не значит, что всегда у всех так, и тем более не значит, что это бессмыслица...



#12 phukortsin

phukortsin
  • Пользователь
  • 391 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 07.09.2018 - 14:48

вполне логично, но исключить достаточно просто -  NOT IN или по категориям или по уже запрошенным товарам

 

Насчет логичности - совсем не очевидно. С точки зрения подкатегории - оно логично. А с точки зрения всей страницы категории - совсем нелогично в списке товаров категории  повторять элементы... 

 

Что-то я сомневаюсь, что исключить будет столь же просто, как в решении ТС из #7. Или может, напишете полное решение, раз уж оно столь просто?



#13 DaVinci

DaVinci
  • Фрилансер
  • 1 019 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 07.09.2018 - 15:21

Насчет логичности - совсем не очевидно. С точки зрения подкатегории - оно логично. А с точки зрения всей страницы категории - совсем нелогично в списке товаров категории  повторять элементы... 

 

Что-то я сомневаюсь, что исключить будет столь же просто, как в решении ТС из #7. Или может, напишете полное решение, раз уж оно столь просто?

 

я уже написал - NOT IN



#14 phukortsin

phukortsin
  • Пользователь
  • 391 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 07.09.2018 - 16:34

я уже написал - NOT IN

 

Прекрасно! Осталось лишь написать, куда конкретно в способ ТС это вставить, чтобы сразу заработало. Чтобы было ПОЛНОЕ решение. А кинуть  обрывок чего-то, что можно использовать в решении, тут и так есть много умельцев - в Сети много всего есть и легко копируется...



#15 DaVinci

DaVinci
  • Фрилансер
  • 1 019 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 07.09.2018 - 17:41

Прекрасно! Осталось лишь написать, куда конкретно в способ ТС это вставить, чтобы сразу заработало. Чтобы было ПОЛНОЕ решение. А кинуть обрывок чего-то, что можно использовать в решении, тут и так есть много умельцев - в Сети много всего есть и легко копируется...


Для автора темы данное решение вполне Полноне. Если вы так не считаете можете дополнить. Я лишь указал на вполне очевидное решение для того что бы исключить дубли. Как кто это реализует дело того кому оно надо.

Не забывайте тему обсуждения - общие

В сети так же достаточно тролей которые выкладывают неполноценное кеширование в платной ветке но при этом им ничто не мешает считать работы других авторов не ПОЛНЫМИ

#16 phukortsin

phukortsin
  • Пользователь
  • 391 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 08.09.2018 - 15:41

Еще есть такой момент в предложенном решении: на каждую подкатегорию делается добавочно 3 запроса к базе.

Так что если, к примеру, имеется 5 подкатегорий, то получаем добавочно 15 запросов. Это добавки к 15 запросам,  которые делаются стандартно.  То есть выходит приличная дополнительная нагрузка на базу.



#17 Kosjak76

Kosjak76
  • Модератор
  • 3 761 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 08.09.2018 - 16:01

Корс, у тебя ЕСТЬ решение лучше?

Ты готов его выложить бесплатно?

Если нет - сиди и не трынди)))



#18 DaVinci

DaVinci
  • Фрилансер
  • 1 019 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 08.09.2018 - 18:32

Еще есть такой момент в предложенном решении: на каждую подкатегорию делается добавочно 3 запроса к базе.
Так что если, к примеру, имеется 5 подкатегорий, то получаем добавочно 15 запросов. Это добавки к 15 запросам, которые делаются стандартно. То есть выходит приличная дополнительная нагрузка на базу.


Решений может быть несколько. Но почему то вы думаете что предполагаемое вами решение самое лучшее.

Какая нагрузка, о чем вы? Если вы так боитесь пользоваться базой, то собственно для чего она предназначена ну откажитесь вы от неё уже в конце концов, и от php откажитесь, пишите на C, Java, они работают быстрее.

Даже если вы якобы одним запросов по group by в извращенном виде достанете все товары подкатегорий то быстрее он не окажется. Или если вы считаете что один запрос с множество подзапросов все так же остается одним то вы очень сильно ошибаетесь.

Люди почитают таких умников потом боятся лишний запрос к базе писать... да и впрочем тут толком никто не видел как пишите вы, потому принимать на веру вменяемость вашей компетенции я бы не стал. Троль он и есть троль
 

сиди и не трынди)))

 

самый отличный совет, Крос я бы на вашем месте прислушался.


Изменено: DaVinci, 08.09.2018 - 18:36


#19 DaVinci

DaVinci
  • Фрилансер
  • 1 019 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 08.09.2018 - 18:51

решение автора вполне лаконично и решает поставленные перед ним задачи и при этом результат работы дополнения не противоречит логике приложение - товары могут находится в нескольких категориях.

 

один Курс не согласен будто для него делали, но сам ни каких решений не публикует  :D



#20 phukortsin

phukortsin
  • Пользователь
  • 391 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 09.09.2018 - 10:21

Решений может быть несколько. Но почему то вы думаете что предполагаемое вами решение самое лучшее.

Какая нагрузка, о чем вы? Если вы так боитесь пользоваться базой, то собственно для чего она предназначена ну откажитесь вы от неё уже в конце концов, и от php откажитесь, пишите на C, Java, они работают быстрее.

Даже если вы якобы одним запросов по group by в извращенном виде достанете все товары подкатегорий то быстрее он не окажется. Или если вы считаете что один запрос с множество подзапросов все так же остается одним то вы очень сильно ошибаетесь.

Люди почитают таких умников потом боятся лишний запрос к базе писать... да и впрочем тут толком никто не видел как пишите вы, потому принимать на веру вменяемость вашей компетенции я бы не стал. Троль он и есть троль

 
Никак не ожидал столь бурной нервной неакции на простенькое замечание.

1. "Но почему то вы думаете что предполагаемое вами решение самое лучшее." - Не припомню, чтобы я где-то писал, что так считаю. Это Вы себе сами почему-то нафантазировали...

2. "Какая нагрузка, о чем вы?" - Всего лишь о том, что добавлять для решения несложной задачи на пустом месте 15 лишних запросов вместо одного простого есть нерациональность...

3. "Даже если ... в извращенном виде..." - Тут Вы совершенно правы. Если в извращенном виде, то будет плохо. А здесь Вам бы стоило включить фантазию и задуматься, а нельзя ли сделать не в извращенном, а в обычном виде простым и аккуратным запросом. Как Вы справедливо заметили вначале, "Решений может быть несколько". Неужто не догадываетесь, что, кроме предложеного, могут быть быть другие решения, причем не извращенные?

4. "Или если вы считаете что один запрос с множество подзапросов все так же остается одним то вы очень сильно ошибаетесь." - Опять фантазии на пустом месте. Я нигде не говорил, что для решения нужен непременно запрос с множеством подзапросов. Мне периодически приходится решать вопросы с тормозами на сайте, в большинстве случаев переделкой запросов, причем вовсе не в сторону их усложнения...

5. "боятся лишний запрос к базе писать" - На главной странице CMS Simpla http://simplacms.ru/ сказано: "Все запросы к базе оптимизированы, на большинстве страниц магазина используется не более десяти SQL-запросов". Это позиционируется как достоинство ситемы, разработчик дает четкий посыл о том, что специально приложил усилия, чтобы уменьшить нагрузку на базу. Если же Вы не согласны с таким подходом, а собираетесь уподобляться домохозяйке из пословицы, которая таскала сметану из погреба маленькими ложками, но это Ваш выбор...

6. "принимать на веру вменяемость вашей компетенции" - куда опять Вас тянут Ваши фантазии? Обсуждать чью-то компетенцию - это Вам в другую тему, а здесь речь идет про конкретное решение конкретного вопроса...






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

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