За последние 24 часа нас посетили 73947 программистов и 10206 роботов. Сейчас ищут 2490 программистов ...

Как сделать, чтобы при отметке чекбокса,его значение checked сохранялось после перезагрузки страницы

Тема в разделе "PHP для новичков", создана пользователем Данил89, 12 июн 2016.

  1. Данил89

    Данил89 Новичок

    С нами с:
    12 июн 2016
    Сообщения:
    7
    Симпатии:
    0
    Просьба помочь решить проблему.
    У меня есть фильтрация товаров в интернет магазине.
    После выделения нужных чекбоксов и нажатия на кнопку "найти" происходит фильтрация и чекбоксы обнуляются. Из-за этого при переходе не другую страницу в постраничной навигации, фильтр сбрасывается.
    Делать нужно через сессии, как я понимаю, в сессию взять массив примерно могу, а вот как потом из сессии вытянуть и чекбоксы нужные активными сделать это точно не могу понять (

    Ниже код запроса для фильтрации и html-код.

    PHP:
    1. public static function getProductsListByCategory($categoryId, $page = 1)
    2.     {
    3.         $limit = Product::SHOW_BY_DEFAULT;
    4.         // Смещение (для запроса)
    5.         $offset = ($page - 1) * self::SHOW_BY_DEFAULT;
    6.  
    7.         // Соединение с БД
    8.         $db = Db::getConnection();
    9.  
    10.  
    11.         if (isset($_POST['submit']))
    12.         {
    13.             if (isset($_POST["brandItem"]))
    14.             {
    15.                 $checkBrand = implode(',', $_POST["brandItem"]);  
    16.             }
    17.             if (isset($_POST["clothItem"]))
    18.             {
    19.                 $checkCloth = implode(',', $_POST["clothItem"]);  
    20.             }
    21.             if (isset($_POST["sizeItem"]))
    22.             {
    23.                 $checkSize = implode(',', $_POST["sizeItem"]);
    24.             }              
    25.         }
    26.  
    27.         if (!empty($checkBrand))
    28.         {
    29.             $queryBrand = "AND product.brand_id IN($checkBrand)";
    30.         } else {
    31.              $queryBrand = "";
    32.         }
    33.         if (!empty($checkCloth))
    34.         {
    35.             $queryCloth = "AND product.cloth_id IN($checkCloth)";
    36.         } else {
    37.             $queryCloth = "";
    38.         }
    39.         if (!empty($checkSize))
    40.         {
    41.             $querySize = "AND product.size_id IN($checkSize)";
    42.         } else {
    43.             $querySize = "";
    44.         }
    45.  
    46.         //Запрос к БД
    47.         $sql = "SELECT product.id, product.name, product.price, product.is_new FROM product "
    48.         . "LEFT JOIN brand ON product.brand_id = brand.id "
    49.         . "LEFT JOIN cloth ON product.cloth_id = cloth.id "
    50.         . "LEFT JOIN size ON product.size_id = size.id "
    51.         . "WHERE status = 1 AND product.category_id = :category_id $queryBrand $queryCloth $querySize "
    52.         . "ORDER BY id ASC LIMIT :limit OFFSET :offset ";
    53.        
    54.         echo $sql;
    55.         print_r($_POST);
    56.  
    57.         // Используется подготовленный запрос
    58.         $result = $db->prepare($sql);
    59.         $result->bindParam(':category_id', $categoryId, PDO::PARAM_INT);
    60.         $result->bindParam(':limit', $limit, PDO::PARAM_INT);
    61.         $result->bindParam(':offset', $offset, PDO::PARAM_INT);
    62.  
    63.         // Выполнение команды
    64.         $result->execute();
    65.  
    66.         // Получение и возврат результатов
    67.         $i = 0;
    68.         $products = array();
    69.         while ($row = $result->fetch()) {
    70.             $products[$i]['id'] = $row['id'];
    71.             $products[$i]['name'] = $row['name'];
    72.             $products[$i]['price'] = $row['price'];
    73.             $products[$i]['is_new'] = $row['is_new'];
    74.             $i++;
    75.         }
    76.         return $products;
    77.     }
    HTML:
    1. <form class="form-filter" action="#" method="post">  
    2.                             <div class="panel">
    3.                                 <div class="panel-heading">
    4.                                     <table>
    5.                                         <tr>
    6.                                             <th>Производитель</th>
    7.                                         </tr>
    8.                                         <?php foreach ($brands as $brandItem): ?>
    9.  
    10.                                             <tr>
    11.                                                 <td>
    12.                                            
    13.                                                     <input type="checkbox" name="brandItem[]"
    14.                                                        id="brand<?php echo $brandItem['id'];?>" value="<?php echo $brandItem['id'];?>">
    15.                                                     <label for="brand<?php echo $brandItem['id'];?>"><?php echo $brandItem['name'];?></label>              
    16.                                                 </td>
    17.                                             </tr>
    18.                                         <?php endforeach; ?>
    19.  
    20.                                         <tr>
    21.                                             <th>Ткань</th>
    22.                                         </tr>
    23.                                         <?php foreach ($cloths as $clothItem): ?>
    24.                                             <tr>
    25.                                                 <td>
    26.                                                     <input type="checkbox" name="clothItem[]"
    27.                                                        id="cloth<?php echo $clothItem['id'];?>" value="<?php echo $clothItem['id'];?>">
    28.                                                     <label for="cloth<?php echo $clothItem['id'];?>"><?php echo $clothItem['name'];?></label>
    29.                                                 </td>
    30.                                             </tr>
    31.                                         <?php endforeach; ?>
    32.  
    33.                                         <tr>
    34.                                             <th>Размер</th>
    35.                                         </tr>
    36.                                         <?php foreach ($sizes as $sizeItem): ?>
    37.                                             <tr>
    38.                                                 <td>
    39.                                                     <input type="checkbox" name="sizeItem[]"
    40.                                                        id="size<?php echo $sizeItem['id'];?>" value="<?php echo $sizeItem['id'];?>">
    41.                                                     <label for="size<?php echo $sizeItem['id'];?>"><?php echo $sizeItem['name'];?></label>
    42.                                                 </td>
    43.                                             </tr>
    44.                                         <?php endforeach; ?>
    45.  
    46.                                         <tr>
    47.                                             <td>
    48.                                                 <input type="submit" name="submit" class="btn btn-default search-filter" value="Найти">
    49.                                             </td>
    50.                                         </tr>
    51.                                     </table>
    52.                                 </div>
    53.                             </div>
    54.                         </form>
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
  3. Данил89

    Данил89 Новичок

    С нами с:
    12 июн 2016
    Сообщения:
    7
    Симпатии:
    0
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Смысл такой, у нас есть список для checkbox, мы на основе этого списка формируем html код этих checkbox, при формировании этого html кода, мы учитываем какие checkbox были выбраны, то есть поставили галочки.

    1. Рисуем checkbox без галочек, это html форма
    2. Если форму отправили, рисуем опять checkbox, но смотрим в отправленные данные формы которые доступны в $_POST
     
  5. Данил89

    Данил89 Новичок

    С нами с:
    12 июн 2016
    Сообщения:
    7
    Симпатии:
    0
    А разве не получится что при перезагрузке страницы все checkbox'ы обнулятся ? ведь $_POST пустой будет.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    да, всё верно, можешь в сессию сохранять выбор если надо
     
  7. Данил89

    Данил89 Новичок

    С нами с:
    12 июн 2016
    Сообщения:
    7
    Симпатии:
    0
    Я и надеялся что тут мне помогут сделать через сессии. Так как вы предложили я уже делал, но не подходит, у меня постраничная навигация, и при переходе на другую страницу фильтр слетает.
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Когда ты листаешь страницы, то передаёшь номер страницы например, туда добавь и параметры поиска, переделай на $_GET, так например реализовано у yandex market
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Так поэтому фильтры почти никогда не делаются на post-запросах. Мало того, что будет слетать при постраничной навигации, я ещё не смогу другу передать ссылку, чтоб показать ему: смотри, вон какие тут планшеты с ценой от 2000 до 5000 (ну к примеру, http://www.ulmart.ru/catalog/95380?...wType=1&rec=false&minPrice=2490&maxPrice=5000)
     
  10. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Выбранный чекбокс сверять по сохраненному значению (раз данные уже сохраняются, значит есть откуда брать) и указывать атрибут checked и не важно где мы будем находиться, а также и в зависимости от страницы - нужно смотреть номер и есть ли такой выбранный чекбокс и делать checked если есть и тогда будет все нормально после перезагрузок.
     
    #10 rodent90, 13 июн 2016
    Последнее редактирование: 13 июн 2016
  11. Данил89

    Данил89 Новичок

    С нами с:
    12 июн 2016
    Сообщения:
    7
    Симпатии:
    0
    Ссылку можно передать, у меня роутер есть.
    Так выглядит строка запроса для страницы категорий, на второй странице в постраничной навигации: http://bontone/category/22/page-2

    А вот метод гет разве не обновится если на другую страницу перейду?
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    немного не об этом речь. Когда ты делаешь фильтр/поиск через POST-запросы, то они будут действовать только один раз - в момент отправки формы. Даже обновление страницы результатов поиска - запросит у пользователя подтверждение повторной отправки формы. GET-запросы в свою очередь не предполагают модификации данных, а лишь их фильтрацию и навигацию. Поэтому сформированную ссылку можно повторно открыть, сохранить в закладки, передать другу, и тп. Повторный вход кем угодно по этой ссылке - будет открывать одинаковый ресурс (при неизменном состоянии системы).

    изменится. И это нормально. Аргументы гет-запроса так же участвуют в идентификации ресурса как и схема-логин-пароль-хост-порт-путь.
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    ты формируешь ссылку на другую страницу, чтобы результаты сохранились, то к этой ссылке добавь параметры из формы
     
    metadon нравится это.
  14. Данил89

    Данил89 Новичок

    С нами с:
    12 июн 2016
    Сообщения:
    7
    Симпатии:
    0
    Да уж надо однозначно через GET делать, а то даже браузер если закрыть, потом открываю через историю например и уже не дает открыть страницу с формой.
    Сделал через метод GET и сессии.
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    С методом $_GET сессии не нужны для пагинации и фильтров. Просто тащишь все параметры в пагинацию. Я обычно примерно так делаю, когда без фреймворка:
    PHP:
    1. function pg_link_parameters($pg)
    2. {
    3.     return http_build_query(array_merge($_GET, ["pg" => $pg]));
    4. }
     
    Данил89 нравится это.
  16. Данил89

    Данил89 Новичок

    С нами с:
    12 июн 2016
    Сообщения:
    7
    Симпатии:
    0
    К черту, уже сроки поджимают, пока с этим разберусь кучу времени убью. Пусть будет как будет, это выпускная работа, после не будет использоваться.
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Было бы с чем разбираться, тем более что дал готовую функцию. Ну как хочешь Зато теперь знаешь, как правильно