Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2016, 21:17   #1
Distemper
Пользователь
 
Регистрация: 05.09.2011
Сообщений: 12
По умолчанию Как запомнить нажатый checkbox?

У меня интернет магазин. В нем фильтр товаров по трем параметрам.
Фильтр работает, но чекбоксы сбрасываются, из-за этого постраничная навигация криво работает. При переходе на следующую страницу фильтры уже не работают.
Подскажите пожалуйста как запомнить что чекбоксы активны.

Код фильтрации товаров. Здесь сразу и вывод по категориям и фильтрация.
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);
        
// Текст запроса к БД
        // $sql = 'SELECT id, name, price, is_new FROM product '
        //         . 'WHERE status = 1 AND category_id = :category_id '
        //         . 'ORDER BY id ASC LIMIT :limit OFFSET :offset';
 
        // Используется подготовленный запрос
        
$result $db->prepare($sql);
        
$result->bindParam(':category_id'$categoryIdPDO::PARAM_INT);
        
$result->bindParam(':limit'$limitPDO::PARAM_INT);
        
$result->bindParam(':offset'$offsetPDO::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>

Последний раз редактировалось Distemper; 12.06.2016 в 21:28.
Distemper вне форума Ответить с цитированием
Старый 12.06.2016, 22:03   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

В случае с фильтрами GET практичнее, чем POST – так как позволяет сохранять состояние фильтров непосредственно в URL для каждой страницы.
Если использовать POST – то можно сохранять состояние фильтров в сессии.
Соответственно, при формировании страницы мы берём эти параметры фильтров из $_GET или $_SESSION, в зависимости от выбранного варианта.
Andkorol вне форума Ответить с цитированием
Старый 12.06.2016, 22:37   #3
Distemper
Пользователь
 
Регистрация: 05.09.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
В случае с фильтрами GET практичнее, чем POST – так как позволяет сохранять состояние фильтров непосредственно в URL для каждой страницы.
Если использовать POST – то можно сохранять состояние фильтров в сессии.
Соответственно, при формировании страницы мы берём эти параметры фильтров из $_GET или $_SESSION, в зависимости от выбранного варианта.
Предполагаю, что подходят только сессии, у меня уже все на методе POST сделано.
Можете подсказать как сделать с сессиями?
Distemper вне форума Ответить с цитированием
Старый 12.06.2016, 23:10   #4
Distemper
Пользователь
 
Регистрация: 05.09.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
В случае с фильтрами GET практичнее, чем POST – так как позволяет сохранять состояние фильтров непосредственно в URL для каждой страницы.
Если использовать POST – то можно сохранять состояние фильтров в сессии.
Соответственно, при формировании страницы мы берём эти параметры фильтров из $_GET или $_SESSION, в зависимости от выбранного варианта.
Записать в сессию думаю могу, а как проверить есть ли там что и сравнить, да потом активировать чекбокс это проблема(

PHP код:
session_start();
 
$_SESSION['checkedBrand'] = (int) isset($_POST['brandItem']); 
Distemper вне форума Ответить с цитированием
Старый 12.06.2016, 23:12   #5
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Если существуют данные из формы ($_POST) – то переменные $checkBrand, $checkCloth и $checkSize получают свои значения из $_POST (как это и сделано сейчас) + происходит запись этих значений в $_SESSION для последующих страниц.
Иначе – эти переменные получают свои значения из $_SESSION (если там есть соответствующие значения для этих переменных, само собой).
Andkorol вне форума Ответить с цитированием
Старый 12.06.2016, 23:33   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Distemper Посмотреть сообщение
а как проверить есть ли там что и сравнить, да потом активировать чекбокс это проблема(
«проверить есть ли там что и сравнить» – точно так же, как уже реализовано в случае с $_POST, абсолютно идентичный код, только вместо $_POST будет $_SESSSION.

Активировать нужный чекбокс нужно примерно так:
PHP код:
<?php
foreach($brands as $brandItem) {
    
$checked = (!empty($_SESSION['brandItem']) && in_array($brandItem['id'], $_SESSION['brandItem'])) ? 'checked' '';
?>
    <input type="checkbox" name="brandItem[]" <?=$checked?> />
<?php
}
?>
Andkorol вне форума Ответить с цитированием
Старый 13.06.2016, 21:37   #7
Distemper
Пользователь
 
Регистрация: 05.09.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
«проверить есть ли там что и сравнить» – точно так же, как уже реализовано в случае с $_POST, абсолютно идентичный код, только вместо $_POST будет $_SESSSION.

[/PHP]
На данный момент у меня так берется из метода пост и запоминается инфомрация в чекбокс
PHP код:
<?php foreach ($brands as $brandItem): ?>

   <?php
        
if (isset($_POST['brandItem']))
        {
            if (
in_array($brandItem['id'], $_POST['brandItem']))
            {
                
$checked 'checked';
                echo 
"yes";
             } else {
                
$checked '';
                echo 
"no";
             }
         }
    
?>

<tr>
   <td>
                                            
       <input <?php echo $checked ?> 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; ?>
Я вообще не могу понять как сессии сделать ((
Distemper вне форума Ответить с цитированием
Старый 13.06.2016, 21:44   #8
Distemper
Пользователь
 
Регистрация: 05.09.2011
Сообщений: 12
По умолчанию

Если через $_POST отправлять данные то всегда при обновлении страницы будет спрашивать подтверждение повторной отправки формы, подскажите пожалуйста?
При $_GET такого не будет?
Distemper вне форума Ответить с цитированием
Старый 13.06.2016, 21:51   #9
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Алгоритм сохранения и использования данных в/из $_SESSION (getProductsListByCategory):
Цитата:
Сообщение от Andkorol Посмотреть сообщение
Если существуют данные из формы ($_POST) – то переменные $checkBrand, $checkCloth и $checkSize получают свои значения из $_POST (как это и сделано сейчас) + происходит запись этих значений в $_SESSION для последующих страниц.
Иначе – эти переменные получают свои значения из $_SESSION (если там есть соответствующие значения для этих переменных, само собой).
Цитата:
Сообщение от Andkorol Посмотреть сообщение
«проверить есть ли там что и сравнить» – точно так же, как уже реализовано в случае с $_POST, абсолютно идентичный код, только вместо $_POST будет $_SESSSION.
Активация чекбоксов при отображении фильтров, используя данные из $_SESSION:
Цитата:
Сообщение от Andkorol Посмотреть сообщение
Активировать нужный чекбокс нужно примерно так:
PHP код:
<?php
foreach($brands as $brandItem) {
    
$checked = (!empty($_SESSION['brandItem']) && in_array($brandItem['id'], $_SESSION['brandItem'])) ? 'checked' '';
?>
    <input type="checkbox" name="brandItem[]" <?=$checked?> />
<?php
}
?>
Что ещё нужно разжевать?
Andkorol вне форума Ответить с цитированием
Старый 13.06.2016, 22:46   #10
Distemper
Пользователь
 
Регистрация: 05.09.2011
Сообщений: 12
По умолчанию

Проверяю есть ли данные в $_POST. Если есть то заношу их в сессию (надеюсь верно, но не уверен).
PHP код:
<?            
 
if (isset($_POST["brandItem"])) 
            {
                
$checkBrand implode(','$_POST["brandItem"]); 
                
$_SESSION['brandChecked'] = $_POST["brandItem"];  
            } else {
                
$_SESSION['brandChecked'] = 0;
            }
?>
Далее прямо по вашему коду, проверяю есть ли в сессии что-то, сравниваю это что-то с id, если нахожу, то устанавливаю переменную cheked.
PHP код:
<?php foreach ($brands as $brandItem): ?>

                            <?php 
                            $checked 
= (!empty($_SESSION['brandChecked']) && in_array($brandItem['id'], $_SESSION['brandChecked'])) ? 'checked' '';
                            
?>
                                            <tr>
                                                <td>
                                            
                                                    <input <?=$checked?> 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; ?>
Только все равно не работает, точнее на одной странице запоминается, но при переходе на другую как обычно слетает все.
Distemper вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить нажатый панель StatusBar-а SASFM Компоненты Delphi 2 27.12.2015 18:26
Как выполнить функцию в случае нажатия на CheckBox, если данный CheckBox был добавлен через код? PAMAC Microsoft Office Excel 7 21.02.2013 15:33
Как запомнить координаты Image? werrey Общие вопросы Delphi 4 21.07.2011 23:08
Как запомнить строку.... Avvakymova Паскаль, Turbo Pascal, PascalABC.NET 10 13.05.2011 23:55
Как запомнить столько Данных? valerij Microsoft Office Excel 18 03.05.2010 19:52