За последние 24 часа нас посетили 34117 программистов и 1709 роботов. Сейчас ищут 739 программистов ...

Устновка ckeckbox по битам

Тема в разделе "PHP для новичков", создана пользователем Ігор, 23 авг 2009.

  1. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    есть некая форма и на ней флажки
    HTML:
    1. <input type="ckeckbox" name="flag[]" value="1" />
    2. <input type="ckeckbox" name="flag[]" value="2" />
    3. <input type="ckeckbox" name="flag[]" value="4" />
    4. <input type="ckeckbox" name="flag[]" value="8" />
    5. <input type="ckeckbox" name="flag[]" value="16" />
    Считать в переменную можно так?
    PHP:
    1.  
    2. <?php
    3.  foreach ($flag as $bit)
    4.    $f=$f || $bit;
    5. ?>
    6.  
    и потом нужно установить флажки помеченными в зависимости от установленных битов в некоторой переменной?

    HTML:
    1. <input type="ckeckbox" name="flag[]" value="1" <?php echo ($v && 1) ? "checked" :""  />
    Поправте, если я неправ, или можно решить проще.
     
  2. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Ігор
    твой код не имеет смысла
    можно ещё in_array использовать
     
  4. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Ігор
    1. не ckeckbox, а checkbox
    2. побитовое сравнение — это одинарные | и &, а не двойные.
    и на счет in_array Mr.M.I.T. прав:
    Весь твой код можно заменить на что-то типа такого:
    PHP:
    1. <?
    2. $checked = empty($_REQUEST['flag']) ? array() : $_REQUEST['flag'];
    3. $values   = array (1, 2, 4, 8, 16);
    4. foreach ($values as $v) {
    5.   $ch = in_array($v, $checked) ? "checked='checked'" : "";
    6.   echo "<input type='checkbox' name='flag[]' value='$v' $ch />";
    7. }
    Суть понятна, думаю. И $values может быть любой, а не только 2 в степени N. Можешь даже текстовые значения сделать.
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Разве в этом смысл?

    Мне кажется, что смысл в том, чтобы в базе хранить все чекбоксы в 1 поле, а не в нескольких.
     
  6. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Правильно, я и хочу хранить все в одном поле. Поэтому и разбираю по битах.
     
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  8. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Тогда такой вопрос: как в FormCacher - Кешер форм инициализировать поля
    В случае добавления записи - значениями по умолчанию,
    В случае редактирования записи - значениями из БД
    ---------
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Mr.M.I.T.
    Вот впариватель)
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Ігор
    там есть в примерах
    FormCacher::proccessByAllRequest($htmlCode,$VarsArray)

    $VarsArray - твои чекбоксы array("flag"=>array(0=>...))
    Kreker
    не зря же я выкладывал, хоть потестят
     
  11. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Мозги пухнут понять не могу.
    Примеры работаю как часики...
    Пытаюсь вставить в ЦМС-ку
    Вставляю в шаблон с формой:
    PHP:
    1.  
    2. <?php
    3.  
    4. ob_start(array(new FormCacher(),"ob_proccess"));
    5.  
    6. FormCacher::setDriver("file",array("file_dir"=>".","file_cookie_name"=>"___FileFormCacherSession"));
    7. if($_POST) {
    8.     FormCacher::SetAllVar();
    9.     FormCacher::Save();
    10. }
    11.  
    12.  
    13.  
    14.  
    15. ?>
    16.                 <form name="folder" action="?" method="POST">
    17.                     <table border="0" cellspacing="0" cellpadding="5">
    18.                         <tr>
    19.                             <td>Введите имя папки:</td>
    20.                             <td colspan="2"><input type="text" name="foldername" value="" size="60" style="width:500px"/></td>
    21.                         </tr>
    22.                         <tr>
    23.                             <td>Описание папки:</td>
    24.                             <td colspan="2"><textarea name="folderdescr" rows="5" cols="60" style="width:500px"></textarea></td>
    25.                         </tr>
    26.  
    27.        ..........................
    28. </div>
    29.  
    30. <?php ob_end_flush() ?>
    31.  
    32.  
    выскакивает ошибка - undefined index file in formcacher line 171
     
  12. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    тогда что-то типа такого:

    PHP:
    1. <?php
    2. $checked = empty($_REQUEST['flag']) ? getFlagsFromDb() : array_sum($_REQUEST['flag']);
    3. $values  = array (1, 2, 4, 8, 16);
    4. foreach ($values as $v) {
    5.   $ch = ($v & $checked) ? "checked='checked'" : "";
    6.   echo "<input type='checkbox' name='flag[]' value='$v' $ch />";
    7. }
    8.  
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    кодировки, не люблю их

    И раз
    http://code.google.com/p/formcacher/downloads/list

    и два
    PHP:
    1. <?
    2. include_once "interface.class.php";
    3. include_once "formcacher.class.php";
    4.  
    5. ob_start(array(new FormCacher(),"ob_proccess"));
    6.  
    7.  
    8.  ?>
    9.                  <form name="folder" method="POST">
    10.                      <table border="0" cellspacing="0" cellpadding="5">
    11.                          <tr>
    12.                              <td>Введите имя папки:</td>
    13.                              <td colspan="2"><input type="text" name="foldername" value="" size="60" style="width:500px"/></td>
    14.                          </tr>
    15.                          <tr>
    16.                              <td>Описание папки:</td>
    17.                              <td colspan="2"><textarea name="folderdescr" rows="5" cols="60" style="width:500px"></textarea></td>
    18.                          </tr>
    19.                      </table>
    20.                      <input type=submit>
    21.                  </form>
    22.  
    23.  <?
    24.  ?>
     
  14. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    1) заработало.
    2) Почему-то кешер "портит" ссылки типа
    HTML:
    1. <a href="?act=aaa">aaa</a>
    превращаются в
    HTML:
    1. <a href="?act=/aaa'">aaa</a>
    3) нет ли возможности прокешировать форму только в cookie?
    4)Как лучше очистить кеш если данные были успешно добавлены?
    (Где размещать в коде? Не в шаблонах же?)
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    3. зачем её кешировать в куки? ты вообще уверен что тебе нужно "кешировать" форму? кешировать значит сохранить значения полей на неопределённый срок
    4. FormCacher::Clear(); где удобно =)
    я бы кешировал в сессию

    2. со ссылками проблема. вот уже полтора часа голову ломаю
     
  16. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    3) неваеное не так понял. Нужно сохранить данные, скажем если в каком-то поле ошибка, чтобы не набирать все заново.
    2) ну пока проблему решил -
    ob_start(array(new FormCacher(),"ob_proccess"));
    ob_end_flush() сразу до и после формы. В шаблонах не совсем красиво - но вполне нормально работает. :)
     
  17. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Ігор
    вообщем, вам не нужно кеширование, оно даёт возможность сохранить данные, и восстанавливать их например если пользователь ушёл на другой сайт и пришёл через час =)
    с ссылками я щас пытаюсь решить
     
  18. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    убрал кучу багов, добавил поддержку MultipleSelect
    вобщем, спасибо за тесты =)
     
  19. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    я в таких случаях не заморачиваюсь, просто в поле вписываю что-то типа ,1,2,4,5,6,

    очень легко обрабатывать implode и explode

    запятая в начале и в конце, что бы не использовать в запросе при поиске CONCAT()

    З.Ы. конечно для очень больших баз не советую
     
  20. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    А откуда скачивать?
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Ігор
    а таже ссылка