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


Фото
* * * * * 3 голосов

Сортировка товаров, товар c кол-вом 0 в конец списка + сорт. по цене

сортировка товара сортировка по цене

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

#21 ids

ids
  • Пользователь
  • 1 сообщений
  • Заказчик, Пользователь

Опубликовано 18.12.2015 - 19:28

Версия 2.2.3. Сортировка по цене не работает, сортирует также как и по умолчанию, но товар с нулевым остатком теперь в конце, что уже хорошо) Поиск работает.



#22 Julius123

Julius123
  • Пользователь
  • 249 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 21.12.2015 - 21:47

Подскажите как вставить в шаблон сортировку вверх, вниз на примере:

 

<option value="{url sort=price page=null}"{if $sort=='price'} selected{/if}>цене</option>
 

Просто при замене на price-max не работает, выводит ссылку на ?sort=0


Изменено: Julius123, 21.12.2015 - 21:57


#23 Julius123

Julius123
  • Пользователь
  • 249 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 22.12.2015 - 17:49

Никто не подскажет?


Изменено: Julius123, 22.12.2015 - 18:01


#24 snagovskiy

snagovskiy
  • Пользователь
  • 47 сообщений

Опубликовано 27.03.2016 - 15:46

Уважаемые форумчане, подскажите пожалуйста, сделал все по инструкции

Вылезли ошибки на сайте и в админке 

http://puu.sh/nVFG3/2402c64c9f.png

http://puu.sh/nVFH5/6b060dd9c5.jpg



#25 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 27.03.2016 - 18:20

Оказывается, эта доработка сортирует  совсем неправильно. Реально работает примерно так: у каждого товара случайным образом выбирается ОДИН ИЗ ВАРИАНТОВ, смотрится количество и  проводится сортировка по этому количеству.

 

Если у всех товаров имеется лишь по одному варианту, то этот метод работает правильно.

 

В общем случае - совершенно непригоден...



#26 snagovskiy

snagovskiy
  • Пользователь
  • 47 сообщений

Опубликовано 27.03.2016 - 18:27

Строку надо добавить в api/Products.php
 
   $products_stock_null_sort='';
   /**/ if(!empty($filter['sort'])){
   /**/  $order = 'IF(v.stock < 1,1,0),'.$order;
   /**/  $group_by = 'GROUP BY p.id';
   /**/  $products_stock_null_sort = 'INNER JOIN __variants v ON p.id = v.product_id';
   /**/ }
 
Спасибо Kors 
 
но доработка действительно фильтрует криво.
 
Допустим есть два цвета товара черный и белый, если черный в наличии, а белый нет, то этот товар попадет под фильтр и будет внизу с другими товарами которых нет в наличии....

Изменено: snagovskiy, 27.03.2016 - 18:35


#27 mishanya

mishanya
  • Фрилансер
  • 2 546 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 27.03.2016 - 18:53

Строку надо добавить в api/Products.php
 
   $products_stock_null_sort='';
   /**/ if(!empty($filter['sort'])){
   /**/  $order = 'IF(v.stock < 1,1,0),'.$order;
   /**/  $group_by = 'GROUP BY p.id';
   /**/  $products_stock_null_sort = 'INNER JOIN __variants v ON p.id = v.product_id';
   /**/ }
 
Спасибо Kors 
 
но доработка действительно фильтрует криво.
 
Допустим есть два цвета товара черный и белый, если черный в наличии, а белый нет, то этот товар попадет под фильтр и будет внизу с другими товарами которых нет в наличии....

 

вариант Кости пробовали? у меня он работает отлично



#28 snagovskiy

snagovskiy
  • Пользователь
  • 47 сообщений

Опубликовано 27.03.2016 - 19:08

вариант Кости пробовали? у меня он работает отлично

Пробовал, не помогло. Я купил http://simpla-tuning...uschie-v-kontse работает отлично



#29 Varyag

Varyag
  • Пользователь
  • 34 сообщений
  • Пользователь
  • Версия CMS:2.x
  • Откуда:Донецкая Народная Республика

Опубликовано 27.03.2016 - 19:12

Пробовал, не помогло. Я купил http://simpla-tuning...uschie-v-kontse работает отлично

А если вдруг поставите доработку своя валюта на вариант. Где будут цены закупки  то $. то в рублях, то в евро. Как будет работать сортировка? Таки я вам скажу - будет жопа


Изменено: Varyag, 27.03.2016 - 19:16


#30 cernos

cernos
  • Фрилансер
  • 369 сообщений
  • Дизайн, Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Донецк/Москва

Опубликовано 04.04.2016 - 00:14

Прищлось править данное решение на одном сайте.

Проблема была в следующем - проверка по наличию идет только по первому варианту.

Я сделал так:

/**/	if(!empty($filter['sort'])){
/**/       $order = 'IF((SELECT COUNT(*) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1), 1, 0) DESC,'.$order; 
/**/	}

Работает при любой сортировке и сбрасывает вниз товары, у которых нет ни одного варианта.

 

ЧИТАЙТЕ ВНИМАТЕЛЬНО ФОРУМ.

КОСЯК ВЫКЛАДЫВАЛ РЕШЕНИЕ

ОНО ВЫШЕ



#31 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 04.04.2016 - 09:11

Прищлось править данное решение на одном сайте.

Проблема была в следующем - проверка по наличию идет только по первому варианту.

Я сделал так:

/**/	if(!empty($filter['sort'])){
/**/       $order = 'IF((SELECT COUNT(*) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1), 1, 0) DESC,'.$order; 
/**/	}

Работает при любой сортировке и сбрасывает вниз товары, у которых нет ни одного варианта.

 

Несколько усложнено.  Чуть проще:

/**/	if(!empty($filter['sort'])){
/**/       $order = '(SELECT COUNT(*) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1) DESC,'.$order; 
/**/	}


#32 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 04.04.2016 - 09:33

А если вдруг поставите доработку своя валюта на вариант. Где будут цены закупки  то $. то в рублях, то в евро. Как будет работать сортировка?

 

1. Обычно на форуме выкладывается решение, рассчитанное на стандартную Simpla.  Случай, когда  "А если вдруг поставите..." при этом не рассматривается. Вы ведь при покупке холодильника не обсуждаете вопрос - а что будет, если я переделаю в доме розетки, их станет меньше и мне некуда будет вилку вставить. Или наводнение случится...

2. Реально ответ на Ваш вопрос зависит от того, как выполнялась доработка. Мне приходилось делать разные подобные доработки. При правильном подходе все работает нормально:

http://simpla-tuning...yword=цен валют

 

Неправильный подход можно найти в теме:

http://forum.simplac...ой-валютепоста/

Там автор в процессе создал даже несколько версий, но полностью все ошибки до конца так и не исправил



#33 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 555 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 04.04.2016 - 09:49

Мне нравится как Корс примеры цитирует :D

#34 Gregar

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

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

Код исправлен, работоспособен и проверен!! Все замечания высказанные kors учтены!

 

Решение простое:

открываем файл: api/Products.php

 

находим функцию: public function get_products($filter = array())

 

Находим кусок кода:

 		if(!empty($filter['sort']))
			switch ($filter['sort'])
			{
				case 'position':
				$order = 'p.position DESC';
				break;
				case 'name':
				$order = 'p.name';
				break;
				case 'created':
				$order = 'p.created DESC';
				break;
				case 'price-min':
				$order = 'v.price';
				break;
				case 'price-max':
				$order = 'v.price DESC';
				break;
			} 

После этого кода вставляем:

/**/	if(!empty($filter['sort'])){
/**/		$order = 'IF(v.stock < 1,1,0),'.$order;
/**/		$group_by = 'GROUP BY p.id';
/**/		$products_stock_null_sort = 'INNER JOIN __variants v ON p.id = v.product_id';
/**/	} 

После находим запрос:

$query = "SELECT  
					p.id,
					p.url,
					p.brand_id,
					p.name,
					p.annotation,
					p.body,
					p.position,
					p.created as created,
					p.visible, 
					p.featured,
					p.rating,
					p.votes, 
					p.meta_title, 
					p.meta_keywords, 
					p.meta_description, 
					b.name as brand,
					b.url as brand_url
............

в этом запросе находим: LEFT JOIN __brands b ON p.brand_id = b.id

после этой строки вставляем: $products_stock_null_sort

Так, чтобы получилось:

				LEFT JOIN __brands b ON p.brand_id = b.id
				$products_stock_null_sort 

+

Под эту же фишку легко сделать СОРТИРОВКУ  ТОВАРА ПО ЦЕНЕ, от меньшей к большему и наоборот, для этого в этом же файле: api/Products.php

в этой же функции:public function get_products($filter = array())

находим:

 		if(!empty($filter['sort']))
			switch ($filter['sort'])
			{
				case 'position':
				$order = 'p.position DESC';
				break;
				case 'name':
				$order = 'p.name';
				break;
				case 'created':
				$order = 'p.created DESC';
				break;
			} 

и заменяем на:

 		if(!empty($filter['sort']))
			switch ($filter['sort'])
			{
				case 'position':
				$order = 'p.position DESC';
				break;
				case 'name':
				$order = 'p.name';
				break;
				case 'created':
				$order = 'p.created DESC';
				break;
				case 'price-min':
				$order = 'v.price';
				break;
				case 'price-max':
				$order = 'v.price DESC';
				break;
			} 

 

Как видим добавили две сортировки: 

price-min - от меньшей цены к большей

price-max - от большей цены к меньшей

 

Для проверки у себя в каталоге товара в URL вставляем: ?sort=price-min

Получится примерно так: http://domen.zz/cata...?sort=price-min

 

 

Пробуйте!

Благодарности в комментарии....

 

Прикрутил все как по инструкции, но как только обновил страницу с товарами, товары пропали. Как только убираю код из api/Products.php тогда сразу все норм становится... какие-то проблемы или что я не совсем понимаю может кто-то готов помочь? 



#35 Gloobus

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

Опубликовано 08.02.2017 - 22:35

Я сделал немного по другому... в API в функции get_products переделал условие:

if(!empty($filter['in_stock']))
	$in_stock_filter = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock']));
else
	$order_stock = '(SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) DESC, ';

Ну и естественно в запросе добавил:

SELECT ...
FROM ...
WHERE ...
ORDER BY $order_stock $order

Все, теперь сортировка работает только тогда, когда запрашиваешь ВСЕ товары, не обращая на то, есть ли они в наличии.

Если у товара есть вариант, возвращает 1, если нет, не возвращает ничего :) А сортировка идет в обратном порядке, то есть сначала те, что в наличии и потом отсутствующие! 



#36 Foх

Foх
  • Пользователь
  • 386 сообщений
  • Верстка
  • Версия CMS:2.x
  • Откуда:Краснодар

Опубликовано 10.05.2017 - 16:59

:) а как сделать чтоб товары которые количество 0 , были в конце в админ панели?



#37 ahmed

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

Опубликовано 10.05.2017 - 18:02

:) а как сделать чтоб товары которые количество 0 , были в конце в админ панели?

 

Без недостатков, скорее всего, никак. Потому что в админ-панели, кроме прочего, задается  сортировка именно по порядку товаров.

Можно формально менять сортировку именно в админке, но тогда возможны проблемы. Например исходная сортировка может сбиваться (при сохранении списка).

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



#38 Foх

Foх
  • Пользователь
  • 386 сообщений
  • Верстка
  • Версия CMS:2.x
  • Откуда:Краснодар

Опубликовано 11.05.2017 - 13:31

Без недостатков, скорее всего, никак. Потому что в админ-панели, кроме прочего, задается  сортировка именно по порядку товаров.

Можно формально менять сортировку именно в админке, но тогда возможны проблемы. Например исходная сортировка может сбиваться (при сохранении списка).

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

 

Ну а данный метод не затрагивает сейчас админ панель? 



#39 ahmed

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

Опубликовано 11.05.2017 - 14:07

Затрагивает одновременно и админку и витрину. При этом методе в админке отсутствующие находятся в конце.

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



#40 Just074

Just074
  • Пользователь
  • 38 сообщений
  • Программирование, Верстка, Заказчик

Опубликовано 22.06.2017 - 20:33

А это для какой версии? 

 

	if(!empty($filter['sort']))
			switch ($filter['sort'])
			{
				case 'position':
				$order = 'p.position DESC';
				break;
				case 'name':
				$order = 'p.name';
				break;
				case 'created':
				$order = 'p.created DESC';
				break;
			} 

 

У меня код такой вот:

 

if(!empty($filter['sort']))
			switch ($filter['sort'])
			{
				case 'position':
				$order = 'p.position DESC';
				break;
				case 'name':
				$order = 'p.name';
				break;
				case 'created':
				$order = 'p.created DESC';
				break;
				case 'pricemin':
				//$order = 'pv.price IS NULL, pv.price=0, pv.price';
				$order = '(SELECT -pv.price FROM __variants pv WHERE (pv.stock IS NULL OR pv.stock>0) AND p.id = pv.product_id AND pv.position=(SELECT MIN(position) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1) LIMIT 1) DESC';
				break;
				case 'pricemax':
				$order = '(SELECT -pv.price FROM __variants pv WHERE (pv.stock IS NULL OR pv.stock>0) AND p.id = pv.product_id AND pv.position=(SELECT MIN(position) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1) LIMIT 1)';
				break;
			}






Также с меткой «сортировка товара, сортировка по цене»

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

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