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

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

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

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

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

по умолчанию сначала по наличию (или количеству товара), а затем одновременно по цене. То есть хочется сделать так, чтобы товар, на который цена 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';

}

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

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


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

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

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


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

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

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

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


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

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

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

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

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


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

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

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


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

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

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


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

Файл: /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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

Файл: /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";

                    }

 

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

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


Ссылка на сообщение
Поделиться на другие сайты
Гость 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";
			}

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


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

 

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

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

 

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";
			}

 

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

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


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

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

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

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


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

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

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

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
Чтоб получить сортировку и в категории и в фильтр про по Возрастанию цены для 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";	
		}
            
и в фильтре незабыть поставить галочку ПРИЖАТ, что б показывало только то что в наличии, тогда будет все тип топ и в категории и при фильтрации

 

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

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


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

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

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

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

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

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

Войти

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

Войти

  • Похожий контент

    • От LionHunter
      Здравствуйте
       
      Возможно кто-то такое делал или знает как: необходимо, чтобы товары в категории сортировались (по умолчанию) в зависимости от количества продаж. То есть, товары, которых продано  больше всего за период существования магазина были вверху и далее по убыванию.
      Это вообще реально сделать? Если вдруг есть тема, где что-то подобное уже обсуждалось - буду благодарен за подсказку.  
    • От ArtMike
      Встал вопрос о модификации стандартной сортировки и возможности добавления в неё сортировки по подкатегориям. Зачем?  Есть же куча модулей - фильтров!
      Я думаю ни для кого не секрет что больше половина трафика практически на любой ресурс идет с мобильных устройств и собственно там их (эти все крутые фильтры просто некуда пихать). А вот стандартная сортировка смотрится компактно и вполне элегантно, работает привычно и функционально для юзера. 
      Вот только бы добавить туда возможность сортировки по подкатегориям. 
      В очередной раз удивлен, что никому это не понадобилось пока и решений я не нашел, ни в РУ сегменте, ни в ЕN сегменте,
      Может кто-то реализовывал подобное? Или готов за разумное вознаграждение помочь? 
       

    • От likesmartass
      300.00 руб
      Скачать/Купить дополнение


      Сортировка перетаскиванием Drag & Drop Sort (товары, категории, атрибуты, опции, производители, статьи)
      Сортировка товаров, категорий, производителей, атрибутов, групп атрибутов, опций, статей одной лишь мышкой! (OpenCart 2.3.x/OcStore 2.3.x)
       
       
      Demo url: http://oc23en.505559.ru/admin/index.php?route=catalog/product
      Demo login: demo
      Demo pass: demo
       
       
       
      Как работать с модулем:
       
      1) Для активации сортировки, необходимо нажать кнопку "Режим перетаскивания".
           
       
      2) (Необязательно!) Если у Вас в магазине много товаров с одинаковым значение сортировки, то нажмите кнопку "Упорядочить сортировку", для автоматической расстановки значений.
           
       
      3) Для сортировки, просто потяните за кнопку или измените числовое значение в поле "Сортировка".
          
       
       
      Автоматическая сортировка расставляет значения "через 1", это сделано для того, чтобы, в ручную можно было расставить номера сортировки легче (т.к. между соседними номерами "зазор").
       
      Гарантируется совместимость со стандартным OpenCart 2.3 и ocStore 2.3. Если у Вас установлены другие модули, мешающие данному модулю, то Вы всегда можете обратиться за адаптацией по почте ed.smartass@gmail.com. Если мешающий модуль/тема популярен (200+ покупок), то адаптация бесплатно!
       
       
      Модуль не заменяет никакие файлы.
      Для установки использовать стандартный установщик OpenCart.
       
      Установка:
      (Дополнения / Установка дополнений) Установите DragSort.*.ocmod.zip, (Дополнения / Менеджер дополнений) Нажмите кнопку обновить.  
      По всем вопросам, багам, замечаниям, предложениям обращаться:
      Почта: ed.smartass@gmail.com; skype: wari0z  
      Добавил likesmartass Добавлено 06.10.2018 Категория Модули Системные требования Сайт разработчика mailto:ed.smartass@gmail.ru Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 2.3 ocStore 2.3 OpenCart.Pro, ocShop  
    • От likesmartass
      Сортировка товаров, категорий, производителей, атрибутов, групп атрибутов, опций, статей одной лишь мышкой! (OpenCart 2.3.x/OcStore 2.3.x)
       
       
      Demo url: http://oc23en.505559.ru/admin/index.php?route=catalog/product
      Demo login: demo
      Demo pass: demo
       
       
       
      Как работать с модулем:
       
      1) Для активации сортировки, необходимо нажать кнопку "Режим перетаскивания".
           
       
      2) (Необязательно!) Если у Вас в магазине много товаров с одинаковым значение сортировки, то нажмите кнопку "Упорядочить сортировку", для автоматической расстановки значений.
           
       
      3) Для сортировки, просто потяните за кнопку или измените числовое значение в поле "Сортировка".
          
       
       
      Автоматическая сортировка расставляет значения "через 1", это сделано для того, чтобы, в ручную можно было расставить номера сортировки легче (т.к. между соседними номерами "зазор").
       
      Гарантируется совместимость со стандартным OpenCart 2.3 и ocStore 2.3. Если у Вас установлены другие модули, мешающие данному модулю, то Вы всегда можете обратиться за адаптацией по почте ed.smartass@gmail.com. Если мешающий модуль/тема популярен (200+ покупок), то адаптация бесплатно!
       
       
      Модуль не заменяет никакие файлы.
      Для установки использовать стандартный установщик OpenCart.
       
      Установка:
      (Дополнения / Установка дополнений) Установите DragSort.*.ocmod.zip, (Дополнения / Менеджер дополнений) Нажмите кнопку обновить.  
      По всем вопросам, багам, замечаниям, предложениям обращаться:
      Почта: ed.smartass@gmail.com; skype: wari0z  
    • От oia15
      Здравствуйте! На OcStore 2.3. Нужно сделать, чтобы ранжирование товаров в категории по умолчанию было по одному из атрибутов товаров. И можно было бы менять только от меньшего к большему / большего к меньшему. Причем для разных категорий может быть разный атрибут, по которому нужно ранжировать. Соответствия category_id -- атрибут, по которому нужно ранжировать категорию можно просто задавать в файле на сервере без интерфейсных наворотов.   Если может кто-то помочь с реализацией задачи?  Сколько будет стоить доработка?   Может если кто модуль подходящий знает, я не нашел. Наверное проще доработкой.
  • Последние посетители   0 пользователей онлайн

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

×

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

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