Как подружить пагинацию и фильтрацию?

Камрады, прошу помощи

Есть тестовый сайт а-ля "магазин часов":
-- справа из БД выводится весь список часов
-- слева фильтр по аналогии с "яндекс-маркетом"
5d38c1e6e2110066037167.png

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

Пример:
открываю первую страницу ввожу все фильтры, отправляю форму, страница обновляется с отфильтрованными элементами и получается такой адрес:
i-market.loc/market.php?from=5000&before=20000&brand%5B%5D=Michael+Kors

Всего при таких фильрах должно остаться 5 товаров, три из которых должны быть на первой странице, а оставшиеся два -- на второй странице.
Но при переходе на вторую страницу, при клике сюда:
<a class="page" href="?page=2">2</a>
весь $_GET исчезает и превращается в i-market.loc/market.php?page=2 и выводятся не оставшиеся два элемента, а просто вторая страница из всей выборки.

Никак не могу придумать, как подружить эти функции.

Собственно код функции, которая отрабатывает по фильтрам и делает базовую пагинацию без фильтров:
в $arr прилетает $_GET
function search(array $arr) {
            $sql = "SELECT * FROM watches WHERE 1=1"; 
            $category = [];
            if(!empty($arr[from])) {
                $sql .= ' AND price>=?';
                $category[] = $arr[from];
            }
            if(!empty($arr[before])) {
                $sql .= ' AND price<=?';
                $category[] = $arr[before];
            }
            foreach ($arr as $nameCategory => $valueCategory) {
                if ($nameCategory != 'from' && $nameCategory != 'before' && $nameCategory != 'page' ) {  
                    if (!empty($arr[$nameCategory])){
                        if (count($arr[$nameCategory]) >= 1) {
                            $sql .= " AND ($nameCategory=?";
                            for ($i=1; $i<count($arr[$nameCategory]); $i++) {
                                $sql .= " OR $nameCategory=?";
                            }
                            $sql .= ')';
                        }
                        foreach ($arr[$nameCategory] as $val) {
                            $category[] = $val;
                        }
                    } 
                }
            }
            $notesOnPage = self::NOTES_ON_PAGE;
            $from = ( $this->pageNumber() - 1) * $notesOnPage;
            $sql .= " LIMIT $from, $notesOnPage";

            $stmt = $this->_instance->prepare($sql);
            $stmt->execute($category);
            $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
            return $result;   
        }
  • Вопрос задан
  • 680 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
после получения из гет номера страницы, ансетим пэйдж в гет, после чего в пэйджинге прибавляем
<a class="page" href="?page=2&<?=http_build_query($_GET)?>">2</a>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Никак не могу придумать, как подружить эти функции.
Через JS-обработчик и склейку/замену нужного параметра.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы