Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

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


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.)

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

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

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


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

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


  • 3 недели спустя...

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

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


Файл: /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
Ссылка на комментарий
Поделиться на других сайтах


  • 8 месяцев спустя...

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

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


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

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


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

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


  • 3 месяца спустя...

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

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


  • 3 месяца спустя...

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

                    }

 

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

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


  • 8 месяцев спустя...

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

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

 

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

  • 6 месяцев спустя...

 

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

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

 

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

 

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

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


  • 3 недели спустя...

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

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

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


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

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

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


  • 3 года спустя...
Чтоб получить сортировку и в категории и в фильтр про по Возрастанию цены для 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
Ссылка на комментарий
Поделиться на других сайтах


  • 2 года спустя...
Спойлер

 

В 29.03.2013 в 10:18, sibas11q сказал:

Файл: /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. Почему-то, чтобы вступило в силу, пришлось просто в админке зайти в любой товар я нажать там сохранить, тогда сортировка начинала работать. На форуме встречал про это, но почему так надо делать без понятия. Может кто в курсе, что за механизм такой?

 

 

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

category.php product.php

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


1 час назад, MBStore сказал:
  Показать контент

 

 

 

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

category.php 15 \u043a\u0411 · 0 downloads product.php 25 \u043a\u0411 · 0 downloads

3я версия OCStore. Ничего не получается, запутался окончательно.

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


Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

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

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