Перейти к содержанию
SSShop

Сортировка в зависимости от наличия. Как?

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

Подскажите пожалуйста как сделать, если количество товара > 0 то сделать порядок сортировки например 0, а если меньше или =0, то порядок сортировки например 1? Чтобы сначала показывался товар в наличии, а потом на заказ.

Поделиться сообщением


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

[uPD]

если правильно понял вопрос, то:

добавить в "ORDER BY" соответствующих sql-запросов условие

quantity DESC

реализация на примере:

catalog/model/catalog/product.php

public function getProductsByCategoryId($category_id, $values, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20)
меняем

if (in_array($sort, $sort_data)) {
			if ($sort == 'pd.name' || $sort == 'p.model') {
				$sql .= " ORDER BY LCASE(" . $sort . ")";
			} else {
				$sql .= " ORDER BY " . $sort;
			}
		} else {
			$sql .= " ORDER BY p.sort_order";	
		}
			
		if ($order == 'DESC') {
			$sql .= " DESC";
		} else {
			$sql .= " ASC";
		}
на

if (in_array($sort, $sort_data)) {
			if ($sort == 'pd.name' || $sort == 'p.model') {
				$sql .= " ORDER BY LCASE(" . $sort . ")";
			} else {
				$sql .= " ORDER BY " . $sort;
			}
			if ($order == 'DESC') {
				$sql .= " DESC";
			} else {
				$sql .= " ASC";
			}
		} else {
			$sql .= " ORDER BY p.quantity DESC";	
		}

решение на скорую руку.

один раз уже переписал :roll:

возможно что-то еще не учел

Поделиться сообщением


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

afwollis, объясни пожалуйста что делает этот код, я вставил у себя, все равно сортировка когда по-умолчанию, то зависит только от порядка сортировки.

Я думаю, что надо сделать так:

1 вариант: Как только товара становится 0 или меньше (например купили или в админке количество изменил), порядок сортировки для этого товара сразу изменяется на 1, а как только я добавил товар в админке и нажал сохранить, то порядок сортировки для этого товара становится 0. Тогда все будет правильно, сначала показаны товары в наличии, а потом на заказ.

2 вариант (лучше, но сложнее как мне кажется): Сделать, чтобы сортировка зависила от порядка сортировки (как сейчас), но учитывала наличие товара, т.е. сначала показывала товары в наличии в том порядке какой номер порядка сортировки, а потом показывала товары на заказ опять же в порядке сортировки.

Поделиться сообщением


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

мда, может я и перемудрил https://opencartforum.com/public/style_emoticons/default/icon_question.gif

сортировка зависит от параметра "ORDER BY" в запросах. формирующих список товаров.

добавление "quantity DESC", как я написал, означает вывод "по количеству товара в порядке убывания" (т.е. начинаем с товаров, которых больше в магазине и потом в конце будут те, которых меньше или вовсе нет).

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

по вашим мыслям:

1. раз это не лучший вариант - пока что пропустим его.

2. может так?

if (in_array($sort, $sort_data)) {
         if ($sort == 'pd.name' || $sort == 'p.model') {
            $sql .= " ORDER BY LCASE(" . $sort . ")";
         } else {
            $sql .= " ORDER BY " . $sort;
         }
         if ($order == 'DESC') {
            $sql .= " DESC";
         } else {
            $sql .= " ASC";
         }
      } else {
         $sql .= " ORDER BY p.quantity DESC, p.sort_order ASC";
      }
$sql .= " ORDER BY p.quantity DESC, p.sort_order ASC";
говорит о том, что сортировка происходит в таком порядке:

1) по количеству товара в порядке убывания (больше товара - выше позиция; меньше - ниже; ноль - еще ниже; меньше ноля - в конце);

2) по полю "порядок сортировки".

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

что-то я вобще не в теме - такое ощущение, что двиг первый раз вижу

Поделиться сообщением


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

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

"говорит о том, что сортировка происходит в таком порядке:

1) по количеству товара в порядке убывания (больше товара - выше позиция; меньше - ниже; ноль - еще ниже; меньше ноля - в конце);

2) по полю "порядок сортировки"."

всем товарам выставил одинаковый порядок сортировки, но у меня он по-умолчанию почему-то сортирует по артикулу и с твоим кодом, и со стандартным https://opencartforum.com/public/style_emoticons/default/icon_question.gif

Поделиться сообщением


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

SSShop, спасибо за терпение и чтение моих не всегда умных мыслей :)

во-первых:

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

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

во-вторых:

возможно вы правы и я опять что-то прое#а... упустил.

но к черту.

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

сейчас есть срочные дела.

Поделиться сообщением


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

Пока сделал так:

в файле catalog/controller/product/category.php

поменял 69 строку

$sort = 'p.sort_order';

на

$sort = 'p.quantity';

Получается теперь все товары в наличии стоят выше товаров на заказ.

Только не понял почему этот способ не работает в файле search.php :)

Поделиться сообщением


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

Пока сделал так:

в файле catalog/controller/product/category.php

поменял 69 строку

$sort = 'p.sort_order';

на

$sort = 'p.quantity';

Получается теперь все товары в наличии стоят выше товаров на заказ.

Только не понял почему этот способ не работает в файле search.php :)

Подскажите как это можно сделать на версии ocStore 0.1.7?

Там есть

$sort = 'p.sort_order';

только она 79 и когда её меняю на

$sort = 'p.quantity';

ничего не происходит, сортировка остается так же по-умолчанию.

Поделиться сообщением


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

Sintez, у меня тоже ocStore 0.1.7 (недавно перешел на него), этот способ работает, чем больше товара, тем товар выше. Это на странице категории. Этот способ просто изменяет сортировку по-умолчанию, тип сортировки остается по-умолчанию.

Поделиться сообщением


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

Sintez, у меня тоже ocStore 0.1.7 (недавно перешел на него), этот способ работает, чем больше товара, тем товар выше. Это на странице категории. Этот способ просто изменяет сортировку по-умолчанию, тип сортировки остается по-умолчанию.

То что тип сортировки остается по-умолчанию я знаю. Меняю код в этом месте:

catalog\controller\product\category.php

$this->data['thumb'] = $this->model_tool_image->resize($image, $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height'));
			
			if (isset($this->request->get['page'])) {
				$page = $this->request->get['page'];
			} else { 
				$page = 1;
			}	
			
			if (isset($this->request->get['sort'])) {
				$sort = $this->request->get['sort'];
			} else {
				$sort = 'p.quantity'; <--------------------Вот тут, строка 79
			}

			if (isset($this->request->get['order'])) {
				$order = $this->request->get['order'];
			} else {
				$order = 'ASC';
			}

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

Подскажите, что я неправильно делаю?

Разобрался....

Отредактировал, то что подсказал afwollis и все норм. Спасибо!

Изменено пользователем Sintez

Поделиться сообщением


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

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

Поделиться сообщением


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

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

Да, есть такое дело...

У меня решилось вот так:

catalog\controller\product\category.php

$this->data['sorts'][] = array(
					'text'  => $this->language->get('text_default'),
					'value' => 'p.quantity-ASC',<--------------Меняем тут, строка 199
					'href'  => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=p.quantityr&order=ASC')<---------------------- и тут
				);

Поделиться сообщением


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

Попробовал все предложенные выше способы - изменений никаких ocStore 0.2.0 :(

$this->data['thumb'] = $this->model_tool_image->resize($image, $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height'));
                        
                        if (isset($this->request->get['page'])) {
                                $page = $this->request->get['page'];
                        } else { 
                                $page = 1;
                        }       
                        
                        if (isset($this->request->get['sort'])) {
                                $sort = $this->request->get['sort'];
                        } else {
                                $sort = 'p.quantity'; <------------------------- поменял тут
                        }

                        if (isset($this->request->get['order'])) {
                                $order = $this->request->get['order'];
                        } else {
                                $order = 'ASC';
                        }

$this->data['sorts'][] = array(
                                        'text'  => $this->language->get('text_default'),
                                        'value' => 'p.quantity-ASC',<-------------- изменил здесь
                                        'href'  => $this->model_tool_seo_url->rewrite(HTTP_SERVER . 'index.php?route=product/category&path=' . $this->request->get['path'] . '&sort=p.quantityr&order=ASC')<------------ и тут поменял
                                );
Подскажите, что еще сделать, чтобы заработала сортировка по наличию на складе.

Поделиться сообщением


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

http://sergey-rasput...3/opencart.html

 

Делаем, товар которого нет в наличии в конце списка при просмотре в категориях. На основе этого можете сделать отображение в поиске, в производителях и т.д

 
Для того чтобы товар которого нет в наличии был в конце списка, нам нужно поменять сортировку по умолчанию. Я отталкивался от значения "количество" и делал сортировку по этому полю.
 
Открываем catalog/controller/product/category.php
 
Ищем строки и делаем как ниже указано:
 
if (isset($this->request->get['sort'])) {
 $sort = $this->request->get['sort'];
} else {
 //$sort = 'p.sort_order';
 $sort = 'p.quantity';
}
 
if (isset($this->request->get['order'])) {
 $order = $this->request->get['order'];
} else {
 //$order = 'ASC';
  $order = 'DESC';
} 
 
После этих изменений товар будет сортироваться по полю количество по убыванию, самое меньшее в конце.

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.