LINUX.ORG.RU

использование массива checkbox


0

0

доброго всем времени суток

не пойму логики работы с чекбоксами
имеем на входе такой html

<FORM NAME="Form2" ACTION="disable.php">

<INPUT TYPE="text" NAME="id[]" value="1">Страшная газета<br>
    <INPUT TYPE="text" NAME="id[]" value="2">6 соток<BR>
    <INPUT TYPE="text" NAME="id[]" value="3">Мурзилка<BR>

    <INPUT TYPE="checkbox" NAME="m[]">отключить<br />
    <INPUT TYPE="checkbox" NAME="m[]">отключить<br />    <INPUT TYPE="checkbox" NAME="m[]" >отключить<br />

    <INPUT type="image" src="/img/button.gif" WIDTH="60" HEIGHT="30">
</FORM> 

=======================

на выходе:

disable.php

p = post;
for(i = 0; i < sizeof(p['id']); i++)
  $db -> query('update magaze set active=p['m'][i] where id=p['id'][i]);



==============
все бы хорошо, но данные скрипт правельно будет работать только в одной ситуации - когда отмечены все чекбоксы

возможно ли как-нибудь получить на выходит массим m такого вида

m = array(
    0 => 0,
    1 => 1,
     2 => 1
);

те что бы не отмеченный значения тоже были видны

спасибо за ответы 
anonymous

> что бы не отмеченный значения тоже были видны

Храни список опций переданных клиенту в сессии, при получении сабмита проверяй какие отмечены. Однако, в общем случае это не нужно, и в твоём, скорее всего тоже.

anonymous
()

PHP принимает массив установленных чекбоксов.

Тупо проверяешь по списку, кто установлен, а кто - нет.

Кстати, массив печатать - не обязательно цикл гонять. См. функции print_r и var_dump

...

А чтобы не возиться вручную со списками, делай соответствующий механизм в фрейворке.

Вот, как у меня (для использования в Smarty): http://hg.balancer.ru/hgwebdir/bors-core/file/71e8100399ba/engines/smarty/plu...

Хэндлер запроса потом берёт переданный автоматический список и сверяется по нему.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>PHP принимает массив установленных чекбоксов.
вот!

еще раз что я хочу сделать - пробежаться по массиву и сделать активным\некативным указаный id.
for(i = 0; i < sizeof(p['id']); i++)
$db -> query('update magaze set active=p['m'][i] where id=p['id'][i]);

в чем проблемма - php принимает массив установленных чекбоксов
приходиться плясать с название чекбокса и тп

что вы делаете в этом случае ?



>Кстати, массив печатать - не обязательно цикл гонять. См. функции print_r и var_dump
да спасибо =)

>А чтобы не возиться вручную со списками, делай соответствующий механизм в фрейворке.
тоже спасибо за наводу, использую =)

>Вот, как у меня (для использования в Smarty): http://hg.balancer.ru/hgwebdir/bors-core/file/71e8100399ba/engines/smarty/plu.. .
ну и xdebug в придачу можно поставить

wow, подсветка синтаксиса понравилоась
если честно использую templatePower - он пошустрее немного
зы поcле extract($param) немного сложно код читать - не зная входных переменных

thx !

anonymous
()

Ну и гадость ваш код.

Это точно html? Согласно <br /> это по крайней мере xhtml, но т.к. тэги в верхнем регистре, это уже не xhtml

Orlangoor ★★★★★
()
Ответ на: комментарий от Orlangoor

странно почему вы еще php код не прокоментировали =) а если серьезно то лучше бы помогли с вопросом =)

anonymous
()

> не пойму логики работы с чекбоксами

Посмотри рабочий код:

http://slil.ru/26073309

(правда, там для тебя много лишнего, но корректировать сейчас нет времени).

josephson ★★
()

foreach($p['id'] as $key => $value) $db->query('update magaze set active='.intval(isset($p['m'][$key])).' where id={$value});

anonymous
()
Ответ на: комментарий от Orlangoor

> Это точно html? Согласно <br /> это по крайней мере xhtml, но т.к. тэги в верхнем регистре, это уже не xhtml

html позволяет использовать <br />, он просто пропускает " /", но верхний регистр - это ппц, пережитки фронтпейджа времен второй мировой.

phasma ★☆
()
Ответ на: комментарий от anonymous

>foreach($p['id'] as $key => $value) $db->query('update magaze set active='.intval(isset($p['m'][$key])).' where id={$value});

вот как раз токи этот код работать и не будет
собственно с чего вопрос и пошел

ps если ты веберешь только один checkbox допустим для третьего
журнала - а неактивным станет первый.

> пержитки второй мировой
серьезно думаешь что я пишу в верхнем регистре ?
этот код - копи\пасте с первого встречного сайта в гугле по html )))

> возможно select ?
смешно =)

anonymous
()
Ответ на: комментарий от anonymous

<FORM NAME="Form2" ACTION="disable.php">

<INPUT TYPE="text" NAME="id[0]" value="1">Страшная газета<br>
<INPUT TYPE="text" NAME="id[1]" value="2">6 соток<BR>
<INPUT TYPE="text" NAME="id[2]" value="3">Мурзилка<BR>

<INPUT TYPE="hidden" NAME="m[0]" value="0">
<INPUT TYPE="checkbox" NAME="m[0]">отключить<br />
<INPUT TYPE="hidden" NAME="m[1]" value="0">
<INPUT TYPE="checkbox" NAME="m[1]">отключить<br />
<INPUT TYPE="hidden" NAME="m[2]" value="0">
<INPUT TYPE="checkbox" NAME="m[2]" >отключить<br />

<INPUT type="image" src="/img/button.gif" WIDTH="60" HEIGHT="30">
</FORM>

Смысл - добавить дублирующие по названиям hidden-элементы формы. Тогда при невыбранных чекбоксах в $_POST всё равно будет выставленная переменная (элемент массива в нашем случае). Номера элементов массива нужно выставлять в любом случае, в стартовом посте при невыставленных NAME="m[digit]" будет смещение номеров элементов при невыставленных предыдущих (например, первый чекбокс невыставлен - номер второго будет $_POST['m'][0])

Slavaz ★★★★★
()

p = post;
for(i = 0; i < sizeof(p['id']); i++)
$db -> query('update magaze set active=p['m'][i] where id=p['id'][i]);

Это, надеюсь, не реальная выдержка кода (нерабочего, ко всему)? :)
Таким прямым способом формировать SQL-запросы... не модно, как минимум ;)

Slavaz ★★★★★
()
Ответ на: комментарий от anonymous

>>foreach($p['id'] as $key => $value) $db->query('update magaze set active='.intval(isset($p['m'][$key])).' where id={$value});

>вот как раз токи этот код работать и не будет >собственно с чего вопрос и пошел

будет, если индексы в форме добавить.

anonymous
()
Ответ на: комментарий от phasma

>html позволяет использовать <br />, он просто пропускает " /"

Код остается не валидным. Хотя конечно гнаться за валидностью глупо, т.к. никаких плюсов она не дает, в случаях когда попытка сделать документ валидным приводит к большим трудозатратам. Но не в этом же случае...

Orlangoor ★★★★★
()
Ответ на: комментарий от anonymous

>будет, если индексы в форме добавить. пример в студию!

anonymous
()
Ответ на: комментарий от anonymous

>будет, если индексы в форме добавить.

пример в студию


>Код остается не валидным. Хотя конечно гнаться за валидностью глупо, т.к. никаких плюсов она не дает, в случаях когда попытка сделать документ валидным приводит к большим трудозатратам. Но не в этом же случае...

что самое интерестное - этот код был содран с первого учебника по
html в гугле. Влом было самому набирать

>Хотя конечно гнаться за валидностью глупо, т.к. никаких плюсов она не дает

мне таки кажеться что если можно - стоит делать валидатные страницы

anonymous
()
Ответ на: комментарий от anonymous

пример был выше.

name="m[0]" вместо m[]

anonymous
()

Чесно говоря логику такого GUI я не очень понял.как вы ожидаете чтоб оно работало? Как я понял задача следующая.
Активировать/деактивировать несколько журналов. В таком случае чек боксы со лейблом "отключить" просто ни к чему. Если флажек напротив имени журнала стоит, значит не активирован, иначе деактивирован.
это 1-е
2-е
Так как на сервер передаются только ВЫДЕЛЕННЫЕ чекбоксы то код типа
for(i = 0; i < sizeof(p['id']); i++)
$db -> query('update magaze set active=p['m'][i] where id=p['id'][i]);
не валиден по определению. Просто нельзя будет деактивировать.
Следовательно надо сделать всего 2 запроса и не парить БД

$db -> query('update magaze set active=1 where id IN (' . join(p['id'], ',') . ')';
$db -> query('update magaze set active=0 where id NOT IN (' . join(p['id'], ',') . ')';
С обственно все.
Функция join не так называется в пхп, я не помню как называется и вспоминать не особо хотчется. гугл точно знает ее название;)
хтмл надеюсь понятно как надо изменить.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.