Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 10.08.2018
Сообщений: 59
1

Сортировка товара методом GET не работает в связке с паджинацией

20.08.2018, 15:40. Показов 2337. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, такая задача стоит:

Сделать сортировку товара (или POST методом, с последующей записью переменных в сессию, или GET методом, но чтобы конфликта не возникало)

На данный момент сделана паджинация вот таким способом, т.е. навигация по страницам идёт через GET запрос:

PHP
1
2
3
4
5
6
7
8
9
10
if ($page != 1) $pervpage = '<li> <a href=?page=1><img src="/assets/img/right_double_arrow.svg" width="15" alt=""></a> </li>';
if ($page != $total) $nextpage = '<li> <a href=?page=' .$total. '><img src="/assets/img/left_double_arrow.svg" width="15" alt=""></a> </li>';
if($page - 2 > 0) $page2left = '<li> <a href=?page='. ($page - 2) .'>'. ($page - 2) .'</a> </li>';
if($page - 1 > 0) $page1left = '<li> <a href=?page='. ($page - 1) .'>'. ($page - 1) .'</a> </li>';
if($page + 2 <= $total) $page2right = '<li> <a href=?page='. ($page + 2) .'>'. ($page + 2) .'</a> </li>';
if($page + 1 <= $total) $page1right = '<li> <a href=?page='. ($page + 1) .'>'. ($page + 1) .'</a> </li>';
if ($total > 1){
echo "<section class='paginate'><ul>";
echo $pervpage.$page2left.$page1left.'<li class="current"><span>'.$page.'</span> </li>'.$page1right.$page2right.$nextpage;
echo "</ul></section>";}
И сделана сортировка, тоже методом GET:

HTML5
1
2
3
4
<div class="sort_by mb-4 mb-xl-0">
   <a href="/catalog/?sorting=price_asc" class="selected">Сначала дешёвые</a>
   <a href="/catalog/?sorting=price_desc">Сначала дорогие</a>
</div>
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$sorting = $_GET['sorting'];
 
switch ($sorting) {
        
        case 'price_asc';
        $sorting = 'catalog.price ASC';
        break;
        
        case 'price_desc';
        $sorting = 'catalog.price DESC';
        break;
        
    default:
    $sorting = 'catalog.id DESC';
    break;
        
};
SQL
1
2
3
4
5
6
SELECT catalog.*, sub_category.sub_category_name
FROM catalog 
JOIN sub_category
ON catalog.sub_category=sub_category.id
ORDER BY $sorting LIMIT
$start, $num

Всё конечно работает, но не так как нужно:
Возьмём к примеру, что у меня 100 товаров и я вывожу по 20 товаров на странице, на первой странице никаких запросов в адресной строке нет и я могу спокойно сортировать товары (на первой странице), но при попытке сортировки на любой другой странице (где в адресной строке уже указан один GET запрос, например ?page=2) ничего не сортируется (т.е. get по сортировке сбрасывается и сортировка не сохраняется на других страницах. Что делать? Победить никак не могу, пробовал в сессию записывать: записывается только то что отправилось на текущей странице, на другую не переносится (имеется в виду при паджинации), пробовал методом POST сделать, так вообще ничего не работает, не знаю уже как быть.

Меня этот конфликт уже замучал, подскажите что-нибудь пожалуйста...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2018, 15:40
Ответы с готовыми решениями:

Сортировка пользовательского списка по цене товара методом пузырька
Программа сортировки пользовательского списка по цене товара методом пузырька--&gt; В результате не...

StringGrid: сортировка методом включения по артикулу и по названию товара
Помогите пожалуйста с написание программы в делфи, нужно использовать массив и компонент...

Не работает случайная сортировка товара 1с-битрикс
Здравствуйте! Помогите решить проблему: со случайной сортировки &quot;RAND&quot; в настройке компонента...

Сортировка методом Шелла не работает
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import...

11
101 / 94 / 38
Регистрация: 30.09.2009
Сообщений: 442
20.08.2018, 15:52 2
Если применена одна из сортировок,
то вам нужно дописывать её условие, в каждую ссылку пейджера.
0
1 / 1 / 0
Регистрация: 10.08.2018
Сообщений: 59
20.08.2018, 15:57  [ТС] 3
Это я понимаю, а как это сделать не знаю(
0
101 / 94 / 38
Регистрация: 30.09.2009
Сообщений: 442
20.08.2018, 16:03 4
Лучший ответ Сообщение было отмечено TheArs как решение

Решение

примерно так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$sorting = $_GET['sorting']??'';// тут добавляется пустая строка, на случай отсутствия данных в get параметре
$page_query=''; // переменная для хранения заданной сортировки.
switch ($sorting) {
        
    case 'price_asc';
        $sorting = 'catalog.price ASC';
        $page_query='&sorting=price_asc';
        break;
        
    case 'price_desc';
        $sorting = 'catalog.price DESC';
        $page_query='&sorting=price_desc';
        break;
        
    default:
        $sorting = 'catalog.id DESC';
        break;
        
};
 
if ($page != 1) $pervpage = '<li> <a href=?page=1'.$page_query.'><img src="/assets/img/right_double_arrow.svg" width="15" alt=""></a> </li>';
if ($page != $total) $nextpage = '<li> <a href=?page=' .$total.$page_query. '><img src="/assets/img/left_double_arrow.svg" width="15" alt=""></a> </li>';
if($page - 2 > 0) $page2left = '<li> <a href=?page='. ($page - 2) .$page_query.'>'. ($page - 2) .'</a> </li>';
if($page - 1 > 0) $page1left = '<li> <a href=?page='. ($page - 1).$page_query .'>'. ($page - 1) .'</a> </li>';
if($page + 2 <= $total) $page2right = '<li> <a href=?page='. ($page + 2) .$page_query.'>'. ($page + 2) .'</a> </li>';
if($page + 1 <= $total) $page1right = '<li> <a href=?page='. ($page + 1) .$page_query.'>'. ($page + 1) .'</a> </li>';
if ($total > 1){
echo "<section class='paginate'><ul>";
echo $pervpage.$page2left.$page1left.'<li class="current"><span>'.$page.'</span> </li>'.$page1right.$page2right.$nextpage;
echo "</ul></section>";}
Добавлено через 4 минуты
получилось следующее:
если в Get приходит условие о сортировке,
то мы в переменную $page_query сохраняем часть запроса,
соответствующую указанному способу сортировки.
Далее, при построении пейджера, добавляем эту часть в ссылки.
В результате, при вызове каждой страницы, сортировка будет указываться автоматически.
1
1 / 1 / 0
Регистрация: 10.08.2018
Сообщений: 59
20.08.2018, 16:10  [ТС] 5
Всё верно, оно работает, но в этом случае у меня другая проблема возникает, когда я нахожусь уже на второй странице, то при нажатии на другую сортировку, меня сбрасывает на самую первую страницу.

Т.е. например я поставил сортировку "Сначала дешёвые", листал страницы, дошёл до 10-ой и решил сортировку поменять, а меня снова на первую перекидывает.

Я вот не знаю это всё-таки большая проблема или нет. Вы как думаете? Стоит ли и это тоже как-то исправлять или это по факту везде так?

_______

P.S. В любом случае уже спасибо за помощь!

Кстати, пришлось оставить так:

PHP
1
$sorting = $_GET['sorting'];
Потому что страница перестаёт загружаться при добавлении пустого значения, но оно и так работает вполне нормально.
0
101 / 94 / 38
Регистрация: 30.09.2009
Сообщений: 442
20.08.2018, 16:11 6
Цитата Сообщение от TheArs Посмотреть сообщение
$start, $num
где у вас задаётся?
0
1 / 1 / 0
Регистрация: 10.08.2018
Сообщений: 59
20.08.2018, 16:13  [ТС] 7
PHP
1
2
3
4
5
6
7
8
9
$result = mysql_query("SELECT COUNT(*) FROM `catalog`");
$temp = mysql_fetch_array($result);
$items = $temp[0];
$total = (($items + $num - 1) / $num);
$total = intval($total);
$page = intval($page);
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
$start = $page * $num - $num;
0
101 / 94 / 38
Регистрация: 30.09.2009
Сообщений: 442
20.08.2018, 16:25 8
Цитата Сообщение от TheArs Посмотреть сообщение
а меня снова на первую перекидывае
у вас в первичной сортировке указано отправлять на первую страницу,
то есть страница совсем не указана.
Если вы там укажите страницу,
вы останетесь на ней же по счёту но данные будут с другого конца извлекаться.

Добавлено через 1 минуту
по идее, если пользователь поменял сортировку, то логично, что нужно начинать просмотр сначала.
Тут уже на ваше усмотрение, как задумаете.

Добавлено через 1 минуту
добавьте в код, формирующий первичную сортировку, условие с номером страницы, которое добавили в пейджер

Добавлено через 3 минуты
примерно так:
PHP/HTML
1
2
3
4
<div class="sort_by mb-4 mb-xl-0">
   <a href="/catalog/?page=<?php echo $page; ?>&sorting=price_asc" class="selected">Сначала дешёвые</a>
   <a href="/catalog/?page=<?php echo $page; ?>&sorting=price_desc">Сначала дорогие</a>
</div>
Добавлено через 2 минуты
Цитата Сообщение от TheArs Посмотреть сообщение
Потому что страница перестаёт загружаться при добавлении пустого значения, но оно и так работает вполне нормально.
возможно версия php старая и оператор ?? в ней не работает

Добавлено через 44 секунды
он по моему только с седьмой версии работает а в 5,6 или 5,4 нет

Добавлено через 1 минуту
тогда можно по старинке инициализировать:
PHP
1
$sorting = !empty($_GET['sorting'])?$_GET['sorting']:'';
1
1 / 1 / 0
Регистрация: 10.08.2018
Сообщений: 59
20.08.2018, 16:27  [ТС] 9
Сейчас посидел, подумал и пришёл к выводу, что на самом деле будет очень странно оставлять пользователя на той же странице, правильнее будет как раз таки на начало его возвращать, всё верно.

Спасибо большое за помощь, ещё раз!

Да, точно у меня же версия 5.6 стоит. Запись в сессию также делал

PHP
1
2
3
session_start();
if ($_POST["num_item"]) {$_SESSION['num_item'] = $_POST["num_item"];}
$num = empty($_SESSION['num_item']) ? 6 : $_SESSION['num_item'];
0
101 / 94 / 38
Регистрация: 30.09.2009
Сообщений: 442
20.08.2018, 16:27 10
иначе есть риск, что при отсутствии sorting в $_GET,
будет выскакивать нотис или варнинг.
1
363 / 305 / 73
Регистрация: 15.09.2017
Сообщений: 1,403
20.08.2018, 16:35 11
Можно попробовать сортировку в путь перенести. Хотя, о каких конфликтах идет речь, я не понял. Естественно, "ничего не сортируется". Вы же не указали параметр для сортировки. Нужно указывать оба параметра, чтобы сортировка наследовалась, пока на какой-нибудь из страниц обратно не будет выбрана сортировка по умолчанию.
0
363 / 305 / 73
Регистрация: 15.09.2017
Сообщений: 1,403
21.08.2018, 09:12 12
Уточнение к предыдущему сообщению. Это было сообщение, перенесенное модератором из другой темы, в которой перед моим ответом кроме стартового сообщения ничего не было.
0
21.08.2018, 09:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2018, 09:12
Помогаю со студенческими работами здесь

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

Не работает сортировка методом выбора
program mv; const N = 10; var C: array of integer; var z,x,v,i,m: integer; begin ...

Не работает сортировка методом вставок
Доброго времени суток, не работает сортировка (выдает ошибку в UBound). В чем проблема? ...

Не работает сортировка методом выбора
Есть сортировка методом Выбора. Делал на основе программы на Паскаль. Почему-то не сортирует,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru