Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

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


sibas11q
 Share

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

}

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

Link to comment
Share on other sites


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

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

Link to comment
Share on other sites


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

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

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

Link to comment
Share on other sites


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

Link to comment
Share on other sites


  • 3 weeks later...

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

Link to comment
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
Link to comment
Share on other sites


  • 8 months later...

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

Link to comment
Share on other sites


  • 3 months later...

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

Link to comment
Share on other sites


  • 3 months later...

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

                    }

 

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

Link to comment
Share on other sites


  • 8 months later...
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";
			}
Link to comment
Share on other sites

  • 6 months later...

 

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

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

 

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

 

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

Link to comment
Share on other sites


  • 3 weeks later...

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

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

Link to comment
Share on other sites


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

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

Link to comment
Share on other sites


  • 3 years later...
Чтоб получить сортировку и в категории и в фильтр про по Возрастанию цены для 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
Link to comment
Share on other sites


  • 2 years later...
Спойлер

 

В 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

Link to comment
Share on other sites


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

 

 

 

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

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

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

Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

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.