Jump to content
Sign in to follow this  
sibas11q

[Решено] Сортировка по умолчанию сначала по количеству, потом по цене

Recommended Posts

Всем здравствуйте.

Подскажите, пожалуйста, как сделать такую сортировку:

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

Зашел в catalog/controller/product/category.php

сделал так:

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 = 'DESC';

}

В итоге сортирует по наличию. Как дальше сделать сортировку по цене, подскажите, пожалуйста.

Share this post


Link to post
Share on other sites

Ну может все же кто-нибудь подскажет, ребята?

Share this post


Link to post
Share on other sites

Вот ссылочка ссылка на которую меня бросали с друого форума, но сделать как там описано не получилось, версия другая (у меня 1.5.4.1.)

може Вы дороеетесь до победы :) ждем!!! Просьба осветить подробненько чего куды.... Спасибо

Share this post


Link to post
Share on other sites

Вот ссылочка ссылка на которую меня бросали с друого форума, но сделать как там описано не получилось, версия другая (у меня 1.5.4.1.)

може Вы дороеетесь до победы :) ждем!!! Просьба осветить подробненько чего куды.... Спасибо

Не, вроде это не поможет.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Файл: /catalog/model/catalog/product.php

if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {

if ($data['sort'] == 'p.quantity' || $data['sort'] == 'p.model') {

$sql .= " ORDER BY p.quantity DESC, p.price";

} else {

$sql .= " ORDER BY " . $data['sort'];

}

} else {

$sql .= " ORDER BY p.sort_order";

}

if (isset($data['order']) && ($data['order'] == 'DESC')) {

$sql .= " ASC, LCASE(pd.name) DESC";

} else {

$sql .= " ASC, LCASE(pd.name) ASC";

}

Пояснение:

1. if ($data['sort'] == 'p.quantity' || $data['sort'] == 'p.model') - тут я заменил на p.quantity (изначально было pd.name), так как у меня в файле /catalog/controller/product/category.php в

if (isset($this->request->get['sort'])) {

$sort = $this->request->get['sort'];

} else {

$sort = 'p.quantity';

}

стоит $sort = 'p.quantity';

2. ORDER BY p.quantity DESC, p.price - это мои данные, по которым мне надо чтобы сортировалось, то есть для меня сортировка должна быть сначала по количеству, затем по цене.

3. $sql .= " ASC, LCASE(pd.name) DESC"; - тут поставил ASC (изначально было DESC), чтобы сортировало по цене по возрастанию.

4. Почему-то, чтобы вступило в силу, пришлось просто в админке зайти в любой товар я нажать там сохранить, тогда сортировка начинала работать. На форуме встречал про это, но почему так надо делать без понятия. Может кто в курсе, что за механизм такой?

  • +1 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

А если надо чтобы сортировалось по наличию (с кол. 0 в конце) , а потом по имени. То как сделать?

Share this post


Link to post
Share on other sites

А если надо чтобы сортировалось по наличию (с кол. 0 в конце) , а потом по имени. То как сделать?

Share this post


Link to post
Share on other sites

Спасибо sibas11q за выложенное решение. С его помощью сделала на своем сайте сортировку по количеству и порядку сортировки. А то после правки только файла catalog/controller/product/category.php товары выводились почему-то в алфавитном порядке. Теперь все о.к., еще раз спасибо!

Share this post


Link to post
Share on other sites

Файл: /catalog/model/catalog/product.php

if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {

if ($data['sort'] == 'p.quantity' || $data['sort'] == 'p.model') {

$sql .= " ORDER BY p.quantity DESC, p.price";

} else {

$sql .= " ORDER BY " . $data['sort'];

}

} else {

$sql .= " ORDER BY p.sort_order";

}

if (isset($data['order']) && ($data['order'] == 'DESC')) {

$sql .= " ASC, LCASE(pd.name) DESC";

} else {

$sql .= " ASC, LCASE(pd.name) ASC";

}

Пояснение:

1. if ($data['sort'] == 'p.quantity' || $data['sort'] == 'p.model') - тут я заменил на p.quantity (изначально было pd.name), так как у меня в файле /catalog/controller/product/category.php в

if (isset($this->request->get['sort'])) {

$sort = $this->request->get['sort'];

} else {

$sort = 'p.quantity';

}

стоит $sort = 'p.quantity';

2. ORDER BY p.quantity DESC, p.price - это мои данные, по которым мне надо чтобы сортировалось, то есть для меня сортировка должна быть сначала по количеству, затем по цене.

3. $sql .= " ASC, LCASE(pd.name) DESC"; - тут поставил ASC (изначально было DESC), чтобы сортировало по цене по возрастанию.

4. Почему-то, чтобы вступило в силу, пришлось просто в админке зайти в любой товар я нажать там сохранить, тогда сортировка начинала работать. На форуме встречал про это, но почему так надо делать без понятия. Может кто в курсе, что за механизм такой?

Подскажите, пожалуйста, достаточно описанных выше действий или обязательно править файл catalog/controller/product/category.php. Пробовал вносить изменения и так и так, но сортирует только по количеству, а по цене нет. У меня версия движка 1.5.6, в файле catalog/model/catalog/product.php следующий фрагмент:

 

if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {

                              if ($data['sort'] == 'p.quantity' || $data['sort'] == 'p.model') {

                                       $sql .= " ORDER BY LCASE(" . $data['sort'] . ")";

                              } elseif ($data['sort'] == 'p.price') {

                                       $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";

                              } else {

                                       $sql .= " ORDER BY " . $data['sort'];

                              }

                    } else {

                              $sql .= " ORDER BY p.sort_order";      

                    }

 

                    if (isset($data['order']) && ($data['order'] == 'DESC')) {

                              $sql .= " DESC, LCASE(pd.name) DESC";

                    } else {

                              $sql .= " ASC, LCASE(pd.name) ASC";

                    }

 

Может кто-то подскажет, что на что заменить.

Share this post


Link to post
Share on other sites
Guest anrisovich

Вывод товаров: порядок сортировки, по наличию.

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

 

1. Файл /catalog/controller/product/category.php - оставляем без изменений.
    По умолчанию должны быть значения: $sort = 'p.sort_order'; и $order = 'ASC';

2. Файл /catalog/model/catalog/product.php - редактируется следующим образом:

а) Находим код:

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

 

б) Заменяем найденный код на:

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

Share this post


Link to post
Share on other sites

 

Вывод товаров: порядок сортировки, по наличию.

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

 

1. Файл /catalog/controller/product/category.php - оставляем без изменений.

    По умолчанию должны быть значения: $sort = 'p.sort_order'; и $order = 'ASC';

2. Файл /catalog/model/catalog/product.php - редактируется следующим образом:

а) Находим код:

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

 

б) Заменяем найденный код на:

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

 

а как быть если фильтр про затирает эти правки? при фильтрации  выдает все в разброс.

Share this post


Link to post
Share on other sites

а как быть если фильтр про затирает эти правки? при фильтрации  выдает все в разброс.

присоединяюсь к вопросу

Share this post


Link to post
Share on other sites

присоединяюсь к вопросу

решил этот вопрос- добавил  сортировку по наличию в начале. все отлично заработало

Share this post


Link to post
Share on other sites

Как бы сделать чтоб при любой сортировке был товар в наличии с filter pro?

Share this post


Link to post
Share on other sites
Чтоб получить сортировку и в категории и в фильтр про по Возрастанию цены для 1.5 версии, сделал так

файл filterpro.php (контроллер)

		if(isset($this->request->post['sort'])) {
			$sort = $this->request->post['sort'];
		} else {
			//$sort = 'p.name';
            $sort = 'p.price';
		}

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



в category.php (контроллер)
if (isset($this->request->get['sort'])) {
			$sort = $this->request->get['sort'];
		} else {
           //  $sort = 'p.sort_order';
           $sort = 'p.price';
          //  $sort = 'p.quantity';
           // $sort = 'p.name';
		}

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



файл catalog/model/catalog/product.php

 /*
        if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
			if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
				$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
			} elseif ($data['sort'] == 'p.price') {
				$sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
			} else {
				$sql .= " ORDER BY " . $data['sort'];
			}
		} else {
			$sql .= " ORDER BY p.sort_order";	
		}
		
		if (isset($data['order']) && ($data['order'] == 'DESC')) {
			$sql .= " DESC, LCASE(pd.name) DESC";
		} else {
			$sql .= " ASC, LCASE(pd.name) ASC";
		}
       */ 
   
        
        // фильтрация по цене и наличию
      
       
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
			if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
				$sql .= " ORDER BY (p.quantity>0) DESC, LCASE(" . $data['sort'] . ")";
			} elseif ($data['sort'] == 'p.price') {
				$sql .= " ORDER BY (p.quantity>0) DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
			} else {
				$sql .= " ORDER BY (p.quantity>0) DESC," . $data['sort'];
			}
		} else {
			$sql .= " ORDER BY (p.quantity>0) DESC, p.sort_order";	
		}
            
и в фильтре незабыть поставить галочку ПРИЖАТ, что б показывало только то что в наличии, тогда будет все тип топ и в категории и при фильтрации

 

Edited by igorfelix

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Similar Content

    • By AntonYagudin
      Всем привет. Это наверное заезженная тема, только нигде нет внятных ответов. Есть магазин на ocStore 2.1.0.1.1. Есть стандартная сортировка. Есть куча вопросов, ЗАРАНЕЕ БЛАГОДАРЮ ЗА ОТВЕТЫ
      1) Где в админке выставляется тип сортировки, т.е. по Рейтингу, от А до Я и т.д. Выставляется ли вообще, или надо лезть в код, как поставить по умолчанию определённый тип.
      2) Влияет ли Filter PRo на стандартную сортировку ocStore
      3) Какой тип сортировки надо поставить по умолчанию, чтобы вверху отображался нужный товар.

    • By Otvet
      Модуль позволяет настраивать сортировку товаров в категориях/производителях/поиске/акциях, а так же добавляет новые варианты сортировки товаров.
      Так же имеется возможность управлять кол-вом товара на страницу и скрывать товары не в наличии
       
      Opencart 3.0 поддерживает с версии модуля 4.0
       
       
      Доступна версии 4.0.1 beta с поддержкой в т.ч. и Opencart 3.0 (по запросу)   ссылка
       
       
      Функции:
      настройка вывода пунктов сортировки в магазине выбор сортировки по умолчанию добавление сортировки по Новизне и Остатку возможность выводить сначала товары в наличии выбор вариантов сортировки по наличию (статус или нулевой остаток) возможность скрыть товары не в наличии настроить список чисел вывода кол-ва товара  
       
      Установка 2.3:
       
      Установка 2.0-2.1:
      Зайдите в Дополнения - Установка Выберите файл *.ocmod.zip (распаковывать не нужно) После установка перейдите в Дополнения - Модификации и обновите кеш Перейдите в Дополнения - Модули и активируйте модуль SORTS+ Выберите нужные настройки и Сохраните При возникновении проблем, установите это http://www.opencart.com/index.php?route=extension/extension/info&extension_id=18892  
      Установка 1.5:
      Распакуйте архив в корень сайта Очистите папку vqcache Перейдите в Дополнения - Модули и активируйте модуль SORTS+ Выберите нужные настройки и Сохраните  
      Установка 3.0-3.1:
      Зайдите в Дополнения - Установка Выберите файл *.ocmod.zip (распаковывать не нужно) После установка перейдите в Дополнения - Модификации и обновите кеш Перейдите в Дополнения - Модули и активируйте модуль SORTS+ Выберите нужные настройки и Сохраните
    • By Otvet
      300.00 руб
      Скачать/Купить дополнение


      Sorts&Limits : Настраиваемая сортировка и скрытие "не в наличии"
      Модуль позволяет настраивать сортировку товаров в категориях/производителях/поиске/акциях, а так же добавляет новые варианты сортировки товаров.
      Так же имеется возможность управлять кол-вом товара на страницу и скрывать товары не в наличии
       
      Opencart 3.0 поддерживает с версии модуля 4.0
       
       
      Доступна версии 4.0.1 beta с поддержкой в т.ч. и Opencart 3.0 (по запросу)   ссылка
       
       
      Функции:
      настройка вывода пунктов сортировки в магазине выбор сортировки по умолчанию добавление сортировки по Новизне и Остатку возможность выводить сначала товары в наличии выбор вариантов сортировки по наличию (статус или нулевой остаток) возможность скрыть товары не в наличии настроить список чисел вывода кол-ва товара  
       
      Установка 2.3:
       
      Установка 2.0-2.1:
      Зайдите в Дополнения - Установка Выберите файл *.ocmod.zip (распаковывать не нужно) После установка перейдите в Дополнения - Модификации и обновите кеш Перейдите в Дополнения - Модули и активируйте модуль SORTS+ Выберите нужные настройки и Сохраните При возникновении проблем, установите это http://www.opencart.com/index.php?route=extension/extension/info&extension_id=18892  
      Установка 1.5:
      Распакуйте архив в корень сайта Очистите папку vqcache Перейдите в Дополнения - Модули и активируйте модуль SORTS+ Выберите нужные настройки и Сохраните  
      Установка 3.0-3.1:
      Зайдите в Дополнения - Установка Выберите файл *.ocmod.zip (распаковывать не нужно) После установка перейдите в Дополнения - Модификации и обновите кеш Перейдите в Дополнения - Модули и активируйте модуль SORTS+ Выберите нужные настройки и Сохраните Добавил Otvet Добавлено 04.10.2015 Категория Фильтры Системные требования Сайт разработчика http://full-index.ru Старая цена Метод активации Автоматическая активация Ioncube Loader Нет OpenCart 3.0
      2.3
      2.2
      2.1
      2.0
      1.5.6.4
      1.5.6.3
      1.5.6.2
      1.5.6.1
      1.5.6
      1.5.5.1
      1.5.5
      1.5.4.1
      1.5.3.1 ocStore 3.0
      2.3
      2.2
      2.1
      1.5.5.1.2
      1.5.5.1.1
      1.5.5.1
      1.5.4.1.2
      1.5.4.1.1
      1.5.4.1
      1.5.3.1
      1.5.2.1
      1.5.1.3 OpenCart.Pro, ocShop Opencart.pro 2.3
      Opencart.pro 2.1
      OcShop 2.0.3.х
      OcShop 1.5.6.4.х Обращение к серверу разработчика Нет  
    • By legioner26
      399.00 руб
      Скачать/Купить дополнение


      Сортировка товаров в заказе по категориям с учетом остатков
      Разработан модификатор с сортировкой товаров в заказе по категориям в админ панели, в пользовательской части, в письме заказчику и письме администратора магазина.
      Данный функционал в разы упрощает работу менеджеров в подборе номенклатуры для выставления счетов.
      Так же в админке в заказах добавлена колонка производителя, фото товара и учет остатков по складу с возможностью сохранять выбор.
      Установка:
      Устанавливаете модификатор через "Установка расширений", далее в модификаторах чистим кешь и обновляем.
       
      Добавил legioner26 Добавлено 27.12.2017 Категория Покупки, оформление заказа, корзина Системные требования Сайт разработчика Старая цена 800 Метод активации Без активации Ioncube Loader Нет OpenCart 2.3
      2.2
      2.1
      2.0 ocStore 2.3
      2.2
      2.1 OpenCart.Pro, ocShop Opencart.pro 2.3
      Opencart.pro 2.1
      OcShop 2.0.3.х Обращение к серверу разработчика Нет  
    • By Rainier
      Здравствуйте, форумчане. Задача достаточно простая, но в то же время актуальная для многих интернет-магазинов. Настроена синхронизация с 1С, при удалении товаров из базы, цена автоматически обнуляется. Нужно настроить сортировку по цене таким образом, чтобы товары с нулевым значением цены отображались в конце списка, а сортировка шла от "1" и более
      Знаю, что нужно выполнить правки в .../catalog/controller/product/category.php и ...catalog/model/catalog/product.php  
       
      if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
                  if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                      $sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
                  } elseif ($data['sort'] == 'p.price') {
                      $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
                  } else {
                      $sql .= " ORDER BY " . $data['sort'];
                  }
              } else {
                  $sql .= " ORDER BY p.sort_order";    
              }
       
      Помогите, пожалуйста, разобраться
  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.