Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: jquery validate & checkbox group
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » jquery validate & checkbox group

Страниц (1): [1]
 

1. Jerry - 08 Июня, 2010 - 10:13:35 - перейти к сообщению
Всем доброго дня, возникла следующая проблема:

в форме есть группа чекбоксов:

CODE (html):
скопировать код в буфер обмена
  1. <div id="itemsblock">
  2. <input name="items" type="checkbox" value="item1" />1
  3. <input name="items" type="checkbox" value="item2" />2
  4. <input name="items" type="checkbox" value="item3" />3
  5. </div>


Проверка формы осуществляется плагином jquery validate.

CODE (javascript):
скопировать код в буфер обмена
  1. rules: {items: {required: "#itemsblock:checked", minlength: 1}}


но если написать такое имя у чекбоксов, name="items[]". Чтобы получить их потом в $_POST['items'] то проверка уже не работает Недовольство, огорчение
пробовал в проверке написать так -
CODE (javascript):
скопировать код в буфер обмена
  1. rules: {items[]: {required: "#itemsblock:checked", minlength: 1}}


тоже не работает... отдельно переделывать все проверки и писать не через этот плагин очень не хочется ((((

Может быть кто то сталкивался с таким и сможет помочь?
Как написать проверку группы чекбоксов с этим плагином?
2. JustUserR - 08 Июня, 2010 - 14:51:16 - перейти к сообщению
Jerry пишет:
Но если написать такое имя у чекбоксов, name="items[]". Чтобы получить их потом в $_POST['items'] то проверка уже не работает
Указанная схема не будет работать не поскольким причинам - во-первых использованием такого синтаксиса как items[]: не является верным с точки зрения JS и подлежит взятию в кавычки с точки зрения ассоциативного массива - а во-вторых имена объетов в DOM-модели также не должны иметь имена с квадратными скобками
Как вариант решения можно оставить имя таким и обращаться по идентификатору ID объекта - например сделать определенный его формат для группы флажков и делать проверку
3. Viper - 09 Июня, 2010 - 12:40:44 - перейти к сообщению
CODE (htmlphp):
скопировать код в буфер обмена
  1. required: "#itemsblock:checked"

чушь написали. как у блочного элемента может быть свойство checked ?
если уж и писать селектор то как-то так
CODE (htmlphp):
скопировать код в буфер обмена
  1. #itemsblock input:checked
4. Jerry - 09 Июня, 2010 - 15:31:17 - перейти к сообщению
видимо надо переписать и делать как посоветовал JustUserR проверку выбора через id...

только вот пока не представляю как эту проверку сделать с плагином вместе...
можете привести какой нибудь пример как встроить эту проверку чекбоксов по id?

вот всё те же чекбоксы, плюс добавл к ним id

CODE (html):
скопировать код в буфер обмена
  1. <div id="itemsblock">
  2. <input id="item1" name="items" type="checkbox" value="Значение1" />1
  3. <input id="item2" name="items" type="checkbox" value="Значение2" />2
  4. <input id="item3" name="items" type="checkbox" value="Значение3" />3
  5. </div>


js для проверки получается такой:

CODE (javascript):
скопировать код в буфер обмена
  1. $(document).ready(function(){
  2. $("#form1").validate({
  3.     focusInvalid: false,
  4.     focusCleanup: true,
  5.  
  6.     rules: {items: {required: "#itemsblock:checked", minlength: 1}},
  7.     messages: {items: "Нужно выбрать хотя бы один пункт"}
  8.  
  9.         });
  10.  
  11. });


#itemsblock:checked - работает точно так же как "#itemsblock input:checked", хотя вместе с input может быть и правильнее...

с проверкой всё ок, а вот в PHP данные об отмеченых чекбоксах не могу... Недовольство, огорчение(
5. Viper - 10 Июня, 2010 - 07:49:50 - перейти к сообщению
Jerry http://api[dot]jquery[dot]com/checked-selector/
а конкретнее первая строка
Цитата:
The :checked selector works for checkboxes and radio buttons. For select elements, use the :selected selector.

поэтому не пишите чушь. проверяя "div attr=checked"

если хотите передать несколько значений чекбоксов, то задайте им имя как массив name="chk_group_1[]" к примеру.

для первого чекбокса в группе пишете атрибут
CODE (htmlphp):
скопировать код в буфер обмена
  1. validate="required:true, minlength:1"
6. Jerry - 10 Июня, 2010 - 09:23:32 - перейти к сообщению
Спасибо за ответ. Уже пробовал задавать имя как массив, но не работает с массивом вообще проверка у меня... вот так пробовал имена задать:
(если убрать массив, то работает, а с массивом - нет)

CODE (html):
скопировать код в буфер обмена
  1. <div id="itemsblock">
  2. <input id="item1" name="items[]" type="checkbox" value="Значение1" validate="required:true, minlength:1"/>1
  3. <input id="item2" name="items[]" type="checkbox" value="Значение2" />2
  4. <input id="item3" name="items[]" type="checkbox" value="Значение3" />3
  5. </div>


Может быть опять что-то не то пишу? Недовольство, огорчение
7. JustUserR - 10 Июня, 2010 - 11:26:16 - перейти к сообщению
Jerry пишет:
Видимо надо переписать и делать как посоветовал JustUserR проверку выбора через id...
Такой способ решение проблемы достаточно очевидный и притом также неплохо поддается автоматизации - например можно динамически сгенерировать соответсвтующие элементы формы и присвоить им ID по определенному шаблону - и работать с ними фактически как с массивом за счет написания фукнци которая будет в DOM-модели выбирать группу флажком по шаблонному имени
8. Viper - 11 Июня, 2010 - 07:27:55 - перейти к сообщению
вообще решение в лоб это без использования плагина валидации

CODE (javascript):
скопировать код в буфер обмена
  1. if ($('#itemsblock input:checked').length < 1) { ...
9. JustUserR - 11 Июня, 2010 - 16:42:50 - перейти к сообщению
Viper пишет:
Вообще решение в лоб это без использования плагина валидации
В таком случае надо проверить чтобы jquery при обращении к группе элементов через класс стиля - не использовал в дальнейшем их имена в for-in циклах иначе это может вызвать аналогичную ошибку
10. Jerry - 01 Июля, 2010 - 09:51:13 - перейти к сообщению
Забыл сразу написать, вдруг кому-нибудь ещё пригодится.
Проблема решалась просто - всего то нужно было поставить кавычки - 'items[]'

Обсуждений такого случая много нашел, и странно, что нигде в примерах использования плагина этого нет. Ответ нашел только где-то глубоко в обсуждениях на каком то из англоязычных форумов...

CODE (html):
скопировать код в буфер обмена
  1. <input name="items[]" type="checkbox" value="Значение1" />1
  2. <input name="items[]" type="checkbox" value="Значение2" />2
  3. <input name="items[]" type="checkbox" value="Значение3" />3


CODE (javascript):
скопировать код в буфер обмена
  1. rules: {'items[]': {required: true, minlength:  1}
11. JustUserR - 01 Июля, 2010 - 14:15:49 - перейти к сообщению
Jerry пишет:
Проблема решалась просто - всего то нужно было поставить кавычки - 'items[]'
Дело в том что структура данных типа JSON которая используется внутри функции в вашем плагине на самом деле является описание анонимного хеш-массива - и его ключи вообще-то могут содержать произвольные символы строки Однако в таком случае указанный хеш-массив перестает быть полным аналогом JS-объекта и не поддерживает точечную форму обращения к элементам - и по этой причине использование таких названий в DOM-моделе впринципе разрешено но может привести к ошибкам в некоторых случаях
12. Leprik - 06 Октября, 2010 - 13:23:33 - перейти к сообщению
Вот поэтому всегда стоит использовать кавычки для всех значений JSON массивов настройки jQuery плагинов.

jQuery 1.3.x -> 1.4.x и JSON
http://habrahabr[dot]ru/blogs/jquery/83892/
13. JustUserR - 07 Октября, 2010 - 00:13:01 - перейти к сообщению
Leprik пишет:
Вот поэтому всегда стоит использовать кавычки для всех значений JSON массивов настройки jQuery плагинов.
В языках программирования в которых реализована поддержка переменных с вариативным именем использование которых связано с системной ассоциативных массивов - как правило существует принцип индифферинциации позвляющий использовать идентификаторы записанные по определенному шаблону в качестве имени переменой - в то время как все остальные применяются исключительно в трактоварии ключа

 

Powered by ExBB FM 1.0 RC1