Массив для флажков в формах HTML - PullRequest
8 голосов
/ 20 июня 2011

У меня есть вопрос по поводу флажков.

<form method="post">
I speak the following languages:
<input type="checkbox" name="lang[]" value="en">English<br />
<input type="checkbox" name="lang[]" value="fr">Français<br />
<input type="checkbox" name="lang[]" value="es">Español<br />
</form>

Необходимо ли называть флажки lang [] (используя массив) или я могу дать каждому флажку отдельное имя, например:

<form method="post">
I speak the following languages:
<input type="checkbox" name="lang_en" value="en">English<br />
<input type="checkbox" name="lang_fr" value="fr">Français<br />
<input type="checkbox" name="lang_es" value="es">Español<br />
</form>

Вопрос 1 Я считаю, что оба работают, если да, когда вы решаете, какой из них использовать?

Вопрос 2 Я использую второй метод, перечисленный выше, поэтому я могу использовать PHP для определения того, какой из флажков выбран, используя код, подобный if(isset($_POST['lang_en'])). Если бы я использовал первый метод, есть ли быстрый способ проверить, установлен ли определенный флажок? На данный момент непроверенное решение, о котором я могу подумать, включает в себя if(in_array('lang_en', $_POST['lang'])), чтобы проверить, существует ли оно в $ _POST.

Вопрос 3 Основной вопрос заключается в следующем: я использую второй метод, поэтому я могу легко проверить, установлен ли флажок в PHP. Теперь я хочу добавить текстовую ссылку, которая при нажатии выберет все флажки. Мой Javascript не слишком хорош, поэтому я использую скрипт из http://www.shiningstar.net/articles/articles/javascript/checkboxes.asp, но пример сценария использует массив для имен флажков, в то время как мой код PHP не может проверить, выбраны ли флажки с массивами, используются для имен флажков , Как можно изменить код javascript для работы без массивов?

Надеюсь, я смогу разгадать этот надоедливый вопрос! Спасибо!

EDIT

Javascript:

<!-- Begin
function checkAll(field)
{
for (i = 0; i < field.length; i++)
    field[i].checked = true ;
}

function uncheckAll(field)
{
for (i = 0; i < field.length; i++)
field[i].checked = false ;
}
//  End -->
</script>

HTML:

<form action="http://localhost/website/places/search" method="post" accept-charset="utf-8" name="subcategory">

<ul>
  <li><input type="checkbox" name="cuisine_American" value="American" /> American</li>
  <li><input type="checkbox" name="cuisine_Chinese" value="Chinese" onClick="checkAll(document.subcategory.cuisine)" /> Chinese</li>
  <li><input type="checkbox" name="cuisine_Indian" value="Indian" onClick="checkAll(document.subcategory.cuisine)" /> Indian</li>
  <li><input type="checkbox" name="cuisine_Japanese" value="Japanese" onClick="checkAll(document.subcategory.cuisine)" /> Japanese</li>
  <li><input type="checkbox" name="cuisine_Korean" value="Korean" onClick="checkAll(document.subcategory.cuisine)" /> Korean</li>
  <li><input type="checkbox" name="cuisine_Mexican" value="Mexican" onClick="checkAll(document.subcategory.cuisine)" /> Mexican</li>
  <li><input type="checkbox" name="cuisine_Middle Eastern" value="Middle Eastern" onClick="checkAll(document.subcategory.cuisine)" /> Middle Eastern</li>
  <li><input type="checkbox" name="cuisine_Pakistani" value="Pakistani" onClick="checkAll(document.subcategory.cuisine)" /> Pakistani</li>
  <li><input type="checkbox" name="cuisine_Italian" value="Italian" onClick="checkAll(document.subcategory.cuisine)" /> Italian</li>
</ul>

</form>

Ответы [ 2 ]

6 голосов
/ 21 июня 2011

1. Обе работы, решение с lang [] гораздо более гибкое. Например, если у вас действительно длинная форма со списком флажков в нескольких категориях, например. языки, на которых говорит пользователь, страны, которые он посетил, машины, на которых он ездил, и, скажем, каждый список состоит из 10 элементов, тогда жесткое кодирование каждого из них - это боль в ..., на стороне PHP вам придется проверять каждый элемент вручную и с помощью массива вы можете сделать это:

if (isset($_POST['lang'] && is_array($_POST['lang'])
{
   // let's iterate thru the array
   foreach ($_POST['lang'] as $lang)
   {
      // do some super-magic here
      // in your example array elements would be $_POST['lang'] = array('en','fr','es')
   }
}

2. Как сказано выше, чтобы проверить, был ли выбран какой-либо из языков, проверьте:

if (in_array('en', $_POST['lang']))

3. Если вы собираетесь использовать jQuery, просто используйте этот фрагмент:

// selector ATTRIBUTE*=VALUE find all tags wchich ATTRIBUTE string contains VALUE
$('input[name*=lang]').attr('checked', 'checked'); // check
$('input[name*=lang]').removeAttr('checked'); // uncheck
6 голосов
/ 20 июня 2011

Ответы:

  1. Либо работает ... зависит от того, хотите ли вы явные имена или массив
  2. Вы также можете использовать array_key_exists()
  3. Можете ли вы опубликовать код JavaScript, который вы используете, в свой вопрос? Я еще посмотрю ...

UPDATE:

Вот решение jQuery для реализации ваших обработчиков onclick:

function checkAll(field){
    $(':checkbox[name^="cuisine_"]').each(function(index){
        this.checked=true;
    });
}

function uncheckAll(field){
    $(':checkbox[name^="cuisine_"]').each(function(index){
        this.checked=false;
    });
}

Обратите внимание, что вам действительно не нужно вводить field, если вы не хотите обобщить это и передать строку для шаблона стартов с (например, cuisine_).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...