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

[Решено] Sort Order (Сортировка по наличию при любой сортировке)

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

Всем привет!

Прошу помощи, нужно сделать наличии товара при любой сортировке, чтоб при выборе сортировки товар у которых количество "0" был самым последним.

 

По сути нужна двойная сортировка

 

Вот что у меня есть на данный момент в 

/catalog/controller/product/category.php

$this->data['sorts'] = array();
			
			$this->data['sorts'][] = array(
				'text'  => $this->language->get('text_default'),
				'value' => 'p.quantity-DESC',
                'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.quantity&order=DESC' . $url)
			);
			
			$this->data['sorts'][] = array(
				'text'  => $this->language->get('text_name_asc'),
				'value' => 'pd.name-ASC',
				'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=pd.name&order=ASC' . $url)
			);

			$this->data['sorts'][] = array(
				'text'  => $this->language->get('text_name_desc'),
				'value' => 'pd.name-DESC',
				'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=pd.name&order=DESC' . $url)
			);

			$this->data['sorts'][] = array(
				'text'  => $this->language->get('text_price_asc'),
				'value' => 'p.price-ASC',
				'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.price&order=ASC' . $url)
			); 

			$this->data['sorts'][] = array(
				'text'  => $this->language->get('text_price_desc'),
				'value' => 'p.price-DESC',
				'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.price&order=DESC' . $url)
			); 
			
			if ($this->config->get('config_review_status')) {
				$this->data['sorts'][] = array(
					'text'  => $this->language->get('text_rating_desc'),
					'value' => 'rating-DESC',
					'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=rating&order=DESC' . $url)
				); 
				
				$this->data['sorts'][] = array(
					'text'  => $this->language->get('text_rating_asc'),
					'value' => 'rating-ASC',
					'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=rating&order=ASC' . $url)
				);
			}
			
			$this->data['sorts'][] = array(
				'text'  => $this->language->get('text_model_asc'),
				'value' => 'p.model-ASC',
				'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.model&order=ASC' . $url)
			);

			$this->data['sorts'][] = array(
				'text'  => $this->language->get('text_model_desc'),
				'value' => 'p.model-DESC',
				'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.model&order=DESC' . $url)
			);
			
			$url = '';
	
			if (isset($this->request->get['sort'])) {
				$url .= '&sort=' . $this->request->get['sort'];
			}	

			if (isset($this->request->get['order'])) {
				$url .= '&order=' . $this->request->get['order'];
			}
			

Сейчас только "По умолчанию" стоит товар в наличии первым 

Как только я выбираю другую сортировку товар не сортируется по наличию

$this->data['sorts'][] = array(
				'text'  => $this->language->get('text_default'),
				'value' => 'p.quantity-DESC',
                'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.quantity&order=DESC' . $url)

Рад буду совету.

Методы которые нашел на форуме не хотят работать.

Стоит + filter lite (pro)

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

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


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

с filterpro у вас ничего не получится, т.к. надо менять в модели, а модель закодирована в ioncube.

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


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

с filterpro у вас ничего не получится, т.к. надо менять в модели, а модель закодирована в ioncube.

исходный код открыт.

Это наверное в filter PRO (full version) он в ioncube закодирован 

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


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

тогда копайте в model/module/filterpro.php

прибивайте туда сортировку по количеству гвоздиками.

category.php вам вообще не нужен скорее всего

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


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

тогда копайте в model/module/filterpro.php

прибивайте туда сортировку по количеству гвоздиками.

category.php вам вообще не нужен скорее всего

в category.php тоже самое продублировано .

Я так понял нужо делать тоже самое и в фильтре и в категории

 

Стоп

Контроллер filterpro.php отвечает за сортировку.

А не модель верно?

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

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


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

ну так и делайте.

пока вы зачем-то показали код контроллера

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


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

Вот что вышло пока

Взят код из этого поста https://opencartforum.com/topic/13773-решено-сортировка-товаров-по-наличию/?do=findComment&comment=301596

 

Вставлен в 

/catalog/model/module/filterpro.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 (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";	
		}

Все работает кроме цена по возрастанию и убыванию . При выборе ничего не происходит просто тишина и ошибок нет . (

А вот если отключить фильтр про и выбрать цену по возрастанию или убыванию вылазит следующая ошибка

Notice: Error: Unknown column 'special' in 'order clause'
Error No: 1054
SELECT p.product_id, p.quantity, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND p2c.category_id = '124' GROUP BY p.product_id 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) LIMIT 0,50 in /var/www/natur101/data/www/site.com/system/database/mysqliz.php on line 53

Есть какие то соображения ? :ph34r:

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

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


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

Основная задача была решена "сортировка по возрастанию цены" !

Вставляем следующий код в

/catalog/model/module/filterpro.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 (p.quantity>0) DESC, LCASE(" . $data['sort'] . ")";
			} elseif ($data['sort'] == 'p.price') {
				$sql .= " ORDER BY (p.quantity>0) DESC," . $data['sort'];
			} else {
				$sql .= " ORDER BY (p.quantity>0) DESC," . $data['sort'];
			}
		} else {
			$sql .= " ORDER BY (p.quantity>0) DESC, p.sort_order";	
		}

Все сортировки работаю отлично!

Кроме блин "сортировка цены по убыванию"

Буду рад помощи !

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

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


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

откуда ты взял эту портяну сортировки по special?

там не хватает чего-то

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


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

откуда ты взял эту портяну сортировки по special?

там не хватает чего-то

последний пост смотри

Есть какие то соображения ?

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


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

берем запрос целиком который не работает, без php кода.

Пихаем его в phpmyadmin и медитируем до тех пор пока он не заработает.

потом переносим назад в php

если медитация не получается, пишем сюда запрос, для совместной медитации

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


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

РЕШЕНО!

ocstore 1.5.4.1 

Товар всегда в наличии при любой сортировке, работает с filterpro lite

 

Вставляем следующий код в

/catalog/model/module/filterpro.php

и

/catalog/model/catalog/product.php

if(isset($data['sort']) && in_array($data['sort'], $sort_data)) {
			if($data['sort'] == 'name' || $data['sort'] == 'model') {
				$sql .= " ORDER BY LCASE (p.quantity>0) DESC, LCASE(" . $data['sort'] . ")";
				} elseif ($data['sort'] == 'p.price') {
			$sql .= " ORDER BY (p.quantity>0) DESC," . $data['sort'];
			} else {
				$sql .= " ORDER BY (p.quantity>0) DESC," . $data['sort'];
			}
		} else {
			$sql .= " ORDER BY (p.quantity>0) DESC, p.sort_order";	
		}
		if(isset($data['order']) && ($data['order'] == 'DESC')) {
			$sql .= " DESC, LCASE(name) DESC";
		} else {
			$sql .= " ASC, LCASE(name) ASC";
		}
Изменено пользователем natural
  • +1 2

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


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

 

 

РЕШЕНО!

 

Не могу плюсануть в репу, поэтому просто пишу : Большое спасибо, очень пригодилось!

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


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

+100500

Премного благодарен!

 

Тоже думал над такой "двойной сортировкой". Уже думал склеивать результаты двух запросов с quantity >0 и =0 в 1 массив. Но интуиция подсказывала мне, что это извращение. А потом и логика подтвердила наличие проблем при пагинации.

 

А все гениально и просто!

Эта строка для меня сегодня просто "шедевр".

 

 

РЕШЕНО!

$sql .= " ORDER BY (p.quantity>0) DESC," . $data['sort'];

 

+100500

Премного благодарен!

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


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

Дополню:

Для вывода проданных товаров в конец,  в файле catalog/model/catalog/product.php

 

SELECT p.product_id,

заменить

на SELECT p.product_id, p.quantity>0 as instock,

и

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['sort']) && in_array($data['sort'], $sort_data)) {
    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
        $sql .= " ORDER BY instock DESC, LCASE(" . $data['sort'] . ")";
    } elseif ($data['sort'] == 'p.price') {
        $sql .= " ORDER BY instock DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
    } else {
        $sql .= " ORDER BY instock DESC, " . $data['sort'];
    }
} else {
    $sql .= " ORDER BY instock DESC, p.sort_order";
}

 

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


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

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

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

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

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

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

Войти

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

Войти

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

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

×

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

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