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

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

 

FIELD(pc.category_id, ?@), p.position

 

Сначала идет очередность категорий согласно переданному массиву идов категорий. Дальше товары которые совпадают по первому критерию (находятся в одной категории) сортируются по p.position (что есть позиция товара). Если у вас не так - то проверяйте что пишется в p.position

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

Вы это имеете ввиду по p.position?

case 'position':
$order = 'p.position DESC';
Изменено пользователем DarAmal
Ссылка на сообщение
Поделиться на другие сайты

Нет. Это нужно смотреть базу. Таблица s_products поле position

У вас в админке в товарах нормально работает сортировка?

Товары отображаются согласно заданному положению? 

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

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

 

Когда внес эту доработку, то на сайте товары все перемешались, т.е. они как бы идут по порядку ID, не так как бы я ранее перетаскивал товары в админке как нужно

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

Альтернативное решение для 15 поста:

 

В api/Products.php ПЕРЕД строкой:

if(!empty($filter['keyword']))
Добавляем:
//Если сортировка по позициям и задана категория 
if((empty($filter['sort']) || $filter['sort']=='position') && !empty($filter['category_id']))
	$order = $this->db->placehold("FIELD(pc.category_id, ?@), p.position DESC",  (array)$filter['category_id']);
PS: больше ничего не нужно Изменено пользователем yr4ik
Ссылка на сообщение
Поделиться на другие сайты
  • 8 месяцев спустя...

Добрый день.

Нужна подсказка.

Юзаю сортировку по-умолчанию вот такую:

$order = '(SELECT p.position FROM __variants pv WHERE 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';

Она опускает товары нет в наличии вниз списка. 

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

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

Пробуйте

$order = '(SELECT 1 FROM s_variants pv WHERE p.id = pv.product_id AND  (pv.stock>0 OR pv.stock IS NULL)  LIMIT 1) DESC, p.name';
Изменено пользователем loxter
Ссылка на сообщение
Поделиться на другие сайты

Пробуйте

$order = '(SELECT 1 FROM s_variants pv WHERE p.id = pv.product_id AND  (pv.stock>0 OR pv.stock IS NULL)  LIMIT 1) DESC, p.name';

 

 

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

Спрашивающий задал вопрос весьма точно и квалифицированно "сортировку по-умолчанию вот такую ... как видоизменить".

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

А если что-то у него пойдет не так (например, сломается  сортировка в админке) и возникнут затруднения - он всегда сможет задать новый вопрос.

 

Формально замечание правильное, но оно - впереди паровоза. С тем же успехом можно к этому вопросу цеплять усложнения типа - а какая версия (вдруг старая экзотическая), а какие изменения делались - от и до. Еще можно сказать - в версии 1 это вообще не работает. В общем, раздолье для подобного бюрократизма...

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

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

Подскажете?

Стоит вот такая:

if(!empty($filter['sort']))
	switch ($filter['sort'])
	{
		case 'position':
		$order = 'p.position DESC';
		break;
 
		// по имени от А до Я
		case 'name_asc':
		$order = 'p.name';
		break;
 
		// по имени от Я до А
		case 'name_desc':
		$order = 'p.name DESC';
		break;
 
		// по цене Низкие > Высокие
		case 'price_asc':
		$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;
 
		// по цене Высокие < Низкие
		case 'price_desc':
		$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 'created':
		$order = 'p.created DESC';
		break;

                case 'views':
                $order = 'p.views DESC';
                break;

 
	}
Изменено пользователем Breedzel
Ссылка на сообщение
Поделиться на другие сайты

И кстати такой тип сортировки затрагивает также и админку

 

Пробуйте

$order = '(SELECT 1 FROM s_variants pv WHERE p.id = pv.product_id AND  (pv.stock>0 OR pv.stock IS NULL)  LIMIT 1) DESC, p.name';
Ссылка на сообщение
Поделиться на другие сайты
  • 1 год спустя...

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

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

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

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

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

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

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

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

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