есть некая форма и на ней флажки HTML: <input type="ckeckbox" name="flag[]" value="1" /> <input type="ckeckbox" name="flag[]" value="2" /> <input type="ckeckbox" name="flag[]" value="4" /> <input type="ckeckbox" name="flag[]" value="8" /> <input type="ckeckbox" name="flag[]" value="16" /> Считать в переменную можно так? PHP: <?php foreach ($flag as $bit) $f=$f || $bit; ?> и потом нужно установить флажки помеченными в зависимости от установленных битов в некоторой переменной? HTML: <input type="ckeckbox" name="flag[]" value="1" <?php echo ($v && 1) ? "checked" :"" /> Поправте, если я неправ, или можно решить проще.
Ігор 1. не ckeckbox, а checkbox 2. побитовое сравнение — это одинарные | и &, а не двойные. и на счет in_array Mr.M.I.T. прав: Весь твой код можно заменить на что-то типа такого: PHP: <? $checked = empty($_REQUEST['flag']) ? array() : $_REQUEST['flag']; $values = array (1, 2, 4, 8, 16); foreach ($values as $v) { $ch = in_array($v, $checked) ? "checked='checked'" : ""; echo "<input type='checkbox' name='flag[]' value='$v' $ch />"; } Суть понятна, думаю. И $values может быть любой, а не только 2 в степени N. Можешь даже текстовые значения сделать.
Разве в этом смысл? Мне кажется, что смысл в том, чтобы в базе хранить все чекбоксы в 1 поле, а не в нескольких.
Тогда такой вопрос: как в FormCacher - Кешер форм инициализировать поля В случае добавления записи - значениями по умолчанию, В случае редактирования записи - значениями из БД ---------
Ігор там есть в примерах FormCacher:roccessByAllRequest($htmlCode,$VarsArray) $VarsArray - твои чекбоксы array("flag"=>array(0=>...)) Kreker не зря же я выкладывал, хоть потестят
Мозги пухнут понять не могу. Примеры работаю как часики... Пытаюсь вставить в ЦМС-ку Вставляю в шаблон с формой: PHP: <?php ob_start(array(new FormCacher(),"ob_proccess")); FormCacher::setDriver("file",array("file_dir"=>".","file_cookie_name"=>"___FileFormCacherSession")); if($_POST) { FormCacher::SetAllVar(); FormCacher::Save(); } ?> <form name="folder" action="?" method="POST"> <table border="0" cellspacing="0" cellpadding="5"> <tr> <td>Введите имя папки:</td> <td colspan="2"><input type="text" name="foldername" value="" size="60" style="width:500px"/></td> </tr> <tr> <td>Описание папки:</td> <td colspan="2"><textarea name="folderdescr" rows="5" cols="60" style="width:500px"></textarea></td> </tr> .......................... </div> <?php ob_end_flush() ?> выскакивает ошибка - undefined index file in formcacher line 171
тогда что-то типа такого: PHP: <?php $checked = empty($_REQUEST['flag']) ? getFlagsFromDb() : array_sum($_REQUEST['flag']); $values = array (1, 2, 4, 8, 16); foreach ($values as $v) { $ch = ($v & $checked) ? "checked='checked'" : ""; echo "<input type='checkbox' name='flag[]' value='$v' $ch />"; }
кодировки, не люблю их И раз http://code.google.com/p/formcacher/downloads/list и два PHP: <? include_once "interface.class.php"; include_once "formcacher.class.php"; ob_start(array(new FormCacher(),"ob_proccess")); ?> <form name="folder" method="POST"> <table border="0" cellspacing="0" cellpadding="5"> <tr> <td>Введите имя папки:</td> <td colspan="2"><input type="text" name="foldername" value="" size="60" style="width:500px"/></td> </tr> <tr> <td>Описание папки:</td> <td colspan="2"><textarea name="folderdescr" rows="5" cols="60" style="width:500px"></textarea></td> </tr> </table> <input type=submit> </form> <? ob_end_flush() ?>
1) заработало. 2) Почему-то кешер "портит" ссылки типа HTML: <a href="?act=aaa">aaa</a> превращаются в HTML: <a href="?act=/aaa'">aaa</a> 3) нет ли возможности прокешировать форму только в cookie? 4)Как лучше очистить кеш если данные были успешно добавлены? (Где размещать в коде? Не в шаблонах же?)
3. зачем её кешировать в куки? ты вообще уверен что тебе нужно "кешировать" форму? кешировать значит сохранить значения полей на неопределённый срок 4. FormCacher::Clear(); где удобно =) я бы кешировал в сессию 2. со ссылками проблема. вот уже полтора часа голову ломаю
3) неваеное не так понял. Нужно сохранить данные, скажем если в каком-то поле ошибка, чтобы не набирать все заново. 2) ну пока проблему решил - ob_start(array(new FormCacher(),"ob_proccess")); ob_end_flush() сразу до и после формы. В шаблонах не совсем красиво - но вполне нормально работает.
Ігор вообщем, вам не нужно кеширование, оно даёт возможность сохранить данные, и восстанавливать их например если пользователь ушёл на другой сайт и пришёл через час =) с ссылками я щас пытаюсь решить
я в таких случаях не заморачиваюсь, просто в поле вписываю что-то типа ,1,2,4,5,6, очень легко обрабатывать implode и explode запятая в начале и в конце, что бы не использовать в запросе при поиске CONCAT() З.Ы. конечно для очень больших баз не советую