Просьба помочь решить проблему. У меня есть фильтрация товаров в интернет магазине. После выделения нужных чекбоксов и нажатия на кнопку "найти" происходит фильтрация и чекбоксы обнуляются. Из-за этого при переходе не другую страницу в постраничной навигации, фильтр сбрасывается. Делать нужно через сессии, как я понимаю, в сессию взять массив примерно могу, а вот как потом из сессии вытянуть и чекбоксы нужные активными сделать это точно не могу понять ( Ниже код запроса для фильтрации и html-код. PHP: public static function getProductsListByCategory($categoryId, $page = 1) { $limit = Product::SHOW_BY_DEFAULT; // Смещение (для запроса) $offset = ($page - 1) * self::SHOW_BY_DEFAULT; // Соединение с БД $db = Db::getConnection(); if (isset($_POST['submit'])) { if (isset($_POST["brandItem"])) { $checkBrand = implode(',', $_POST["brandItem"]); } if (isset($_POST["clothItem"])) { $checkCloth = implode(',', $_POST["clothItem"]); } if (isset($_POST["sizeItem"])) { $checkSize = implode(',', $_POST["sizeItem"]); } } if (!empty($checkBrand)) { $queryBrand = "AND product.brand_id IN($checkBrand)"; } else { $queryBrand = ""; } if (!empty($checkCloth)) { $queryCloth = "AND product.cloth_id IN($checkCloth)"; } else { $queryCloth = ""; } if (!empty($checkSize)) { $querySize = "AND product.size_id IN($checkSize)"; } else { $querySize = ""; } //Запрос к БД $sql = "SELECT product.id, product.name, product.price, product.is_new FROM product " . "LEFT JOIN brand ON product.brand_id = brand.id " . "LEFT JOIN cloth ON product.cloth_id = cloth.id " . "LEFT JOIN size ON product.size_id = size.id " . "WHERE status = 1 AND product.category_id = :category_id $queryBrand $queryCloth $querySize " . "ORDER BY id ASC LIMIT :limit OFFSET :offset "; echo $sql; print_r($_POST); // Используется подготовленный запрос $result = $db->prepare($sql); $result->bindParam(':category_id', $categoryId, PDO::PARAM_INT); $result->bindParam(':limit', $limit, PDO::PARAM_INT); $result->bindParam(':offset', $offset, PDO::PARAM_INT); // Выполнение команды $result->execute(); // Получение и возврат результатов $i = 0; $products = array(); while ($row = $result->fetch()) { $products[$i]['id'] = $row['id']; $products[$i]['name'] = $row['name']; $products[$i]['price'] = $row['price']; $products[$i]['is_new'] = $row['is_new']; $i++; } return $products; } HTML: <form class="form-filter" action="#" method="post"> <div class="panel"> <div class="panel-heading"> <table> <tr> <th>Производитель</th> </tr> <?php foreach ($brands as $brandItem): ?> <tr> <td> <input type="checkbox" name="brandItem[]" id="brand<?php echo $brandItem['id'];?>" value="<?php echo $brandItem['id'];?>"> <label for="brand<?php echo $brandItem['id'];?>"><?php echo $brandItem['name'];?></label> </td> </tr> <?php endforeach; ?> <tr> <th>Ткань</th> </tr> <?php foreach ($cloths as $clothItem): ?> <tr> <td> <input type="checkbox" name="clothItem[]" id="cloth<?php echo $clothItem['id'];?>" value="<?php echo $clothItem['id'];?>"> <label for="cloth<?php echo $clothItem['id'];?>"><?php echo $clothItem['name'];?></label> </td> </tr> <?php endforeach; ?> <tr> <th>Размер</th> </tr> <?php foreach ($sizes as $sizeItem): ?> <tr> <td> <input type="checkbox" name="sizeItem[]" id="size<?php echo $sizeItem['id'];?>" value="<?php echo $sizeItem['id'];?>"> <label for="size<?php echo $sizeItem['id'];?>"><?php echo $sizeItem['name'];?></label> </td> </tr> <?php endforeach; ?> <tr> <td> <input type="submit" name="submit" class="btn btn-default search-filter" value="Найти"> </td> </tr> </table> </div> </div> </form>
http://code.runnable.com/VTSNl5PkmAYuVsGs/simple-checkbox-list-and-array-for-php http://code.runnable.com/VTUxcxHr5sJO0Anz/html-checkbox-list-poll-and-php-array
Спасибо, а не могли бы вы пояснить данный код? Я его не очень понимаю, там все время что-то во что-то подставляется.
Смысл такой, у нас есть список для checkbox, мы на основе этого списка формируем html код этих checkbox, при формировании этого html кода, мы учитываем какие checkbox были выбраны, то есть поставили галочки. 1. Рисуем checkbox без галочек, это html форма 2. Если форму отправили, рисуем опять checkbox, но смотрим в отправленные данные формы которые доступны в $_POST
А разве не получится что при перезагрузке страницы все checkbox'ы обнулятся ? ведь $_POST пустой будет.
Я и надеялся что тут мне помогут сделать через сессии. Так как вы предложили я уже делал, но не подходит, у меня постраничная навигация, и при переходе на другую страницу фильтр слетает.
Когда ты листаешь страницы, то передаёшь номер страницы например, туда добавь и параметры поиска, переделай на $_GET, так например реализовано у yandex market
Так поэтому фильтры почти никогда не делаются на post-запросах. Мало того, что будет слетать при постраничной навигации, я ещё не смогу другу передать ссылку, чтоб показать ему: смотри, вон какие тут планшеты с ценой от 2000 до 5000 (ну к примеру, http://www.ulmart.ru/catalog/95380?...wType=1&rec=false&minPrice=2490&maxPrice=5000)
Выбранный чекбокс сверять по сохраненному значению (раз данные уже сохраняются, значит есть откуда брать) и указывать атрибут checked и не важно где мы будем находиться, а также и в зависимости от страницы - нужно смотреть номер и есть ли такой выбранный чекбокс и делать checked если есть и тогда будет все нормально после перезагрузок.
Ссылку можно передать, у меня роутер есть. Так выглядит строка запроса для страницы категорий, на второй странице в постраничной навигации: http://bontone/category/22/page-2 А вот метод гет разве не обновится если на другую страницу перейду?
немного не об этом речь. Когда ты делаешь фильтр/поиск через POST-запросы, то они будут действовать только один раз - в момент отправки формы. Даже обновление страницы результатов поиска - запросит у пользователя подтверждение повторной отправки формы. GET-запросы в свою очередь не предполагают модификации данных, а лишь их фильтрацию и навигацию. Поэтому сформированную ссылку можно повторно открыть, сохранить в закладки, передать другу, и тп. Повторный вход кем угодно по этой ссылке - будет открывать одинаковый ресурс (при неизменном состоянии системы). изменится. И это нормально. Аргументы гет-запроса так же участвуют в идентификации ресурса как и схема-логин-пароль-хост-порт-путь.
ты формируешь ссылку на другую страницу, чтобы результаты сохранились, то к этой ссылке добавь параметры из формы
Да уж надо однозначно через GET делать, а то даже браузер если закрыть, потом открываю через историю например и уже не дает открыть страницу с формой. Сделал через метод GET и сессии.
С методом $_GET сессии не нужны для пагинации и фильтров. Просто тащишь все параметры в пагинацию. Я обычно примерно так делаю, когда без фреймворка: PHP: function pg_link_parameters($pg) { return http_build_query(array_merge($_GET, ["pg" => $pg])); }
К черту, уже сроки поджимают, пока с этим разберусь кучу времени убью. Пусть будет как будет, это выпускная работа, после не будет использоваться.
Было бы с чем разбираться, тем более что дал готовую функцию. Ну как хочешь Зато теперь знаешь, как правильно