Валидация формы работает не совсем так
Здравствуйте.
Есть форма, состоящая из ряда одинаковых блоков
<div class="progblock">
<div class="strelka"><a href=""><img src="/template/img/ico/strelka.png" class="img-responsive"></a></div>
<label class="bold_name"><input type="checkbox" name="public"
class="public osnova" value="Программа 1"> Программа 1</label>
<div class="napravlenie hides" style="display:none;">
<div class="checkbox col-xs-6 forma_obuchen">
<select name="ot_forma1" class="form-control">
<option value="">Форма обучения</option>
<option value="Очно-заочная">Очно-заочная</option>
<option value="Дистанционная">Дистанционная</option>
</select>
</div>
<div class="checkbox col-xs-6 kolvo_uchenik">
<input type="number" name="ot_kolvo1" value=""
class="form-control" placeholder="Число слушателей">
</div>
</div>
<div class="clearfix"></div>
</div>
Есть скрипт, отвечающий за сбор данных с формы и передачу их на следующий шаг, а также за валидацию формы. У нас при выборе каких-либо чекбоксов происходит разворачивание скрытого блока под чекбоксом и там уже пользователь выбирает форму обучения и количество слушателей. Вот без выбранных этих двух полей дальнейший шаг - открытие модального окна выполняться не должен.
$(document).ready(function() {
$('a.podtv').click(function(e) {
e.preventDefault();
var arr= [].map.call($('input:checkbox:checked'),function(el) {
var parent = $(el).parents('.progblock');
return {'name' : el.value, 'type' : $('select',parent).val(), 'val' : $('[type="number"]',parent).val()}});
var mass = JSON.stringify(arr, null, 4);
// Блок валидации
var es = $('input:checkbox:checked')
var parents = $(es).parents('.progblock');
var selprogblock = $('select',parents).val();
var numprogblock = $('[type="number"]',parents).val();
// Проверяем выбрана ли форма обучения
if (selprogblock == '') {
alert('Выберите форму обучения!');
}
// Проверяем выбрано ли количество слушателей
else if (numprogblock == '') {
alert('Введите количество слушателей!');
}
else {
for (var i = 0; i < arr.length; i++) {
$(".info_users_prog").append('<p>' + arr[i].name + '</p><ul><li>' + arr[i].type + '</li><li>' + arr[i].val + '</li></ul>');
$(".parameter").append('<input type="hidden" name="names[]" value="' + arr[i].name + '">');
$(".parameter").append('<input type="hidden" name="types[]" value="' + arr[i].type + '">');
$(".parameter").append('<input type="hidden" name="vals[]" value="' + arr[i].val + '">');
$("#myModal").show("slow");
}
}
});
$('button.close').click(function(e) {
$("#myModal").hide("slow");
arr = [];
$('.info_users_prog').empty();
});
$('button.closer').click(function(e) {
$("#myModal").hide("slow");
arr = [];
$('.info_users_prog').empty();
$('.parameter').empty();
});
});
Но на практике форма состоит не из одного блока а из многих. И если хотя бы в одном из них данные по форме обучения и количеству слушателей выбраны, то на остальные валидация не реагирует и форма проходит валидацию. Как сделать чтобы проверялись все поля у выбранных чекбоксов? |
Помогите, пожалуйста. Все уже перепробовал, не получается правильно сделать валидацию все select и input из выбранных checkbox.
|
Полям обязательным к заполнению добавьте атрибут required и браузер сам не разрешит отправку формы при незаполненных. А уже скрпту получить коллекцию этих полей и проверить их заполнение после trim.
|
Цитата:
По сути это просто набор div'ов а все действо происходит по нажатию на ссылку с классом podtv А вот уже потом открывается модальное окно с формой, в которую переданы выбранные данные и там уже пользователь вводит имя, телефон и т.д. и отправляет. Мне же нужно, чтобы даже модалка не открывалась и вылезало сообщение если в каком-либо из выбранных чекбоксов не выбрана форма обучения или не проставлено количество слушателей. Если нужно, могу полный код выложить. |
Цитата:
alert('Введите количество слушателей!'); } А "помечаем" нужные нам элементы (которые обязательно должны быть выбраны), в атрибутах их же можно описать и правила/текст, чтобы не лепить на каждый блок свои проверки и не дай бог свои обработчики. В конечном же итоге сервер будут ожидать поля, которые судя по условию должны быть обязательно заполнены/выбраны, а уж в каком порядке это было сделано на клиенте, так это не так и важно. |
Цитата:
|
Точно также как например определить один обработчик на несколько элементов. То есть флажки или иное имеют один обработчик, который раскрывает следующие поля для выбора. А данным полям как-то <select name="ot_forma1" class="form-control"> атрибут required - <select name="ot_forma1" class="form-control" required>. Если запрашивается на раскрытие полей, то проверяется есть ли у запрашиваемого блока предыдущий и если есть, то получить все поля с атрибутом required, и открыть блок только в том случае, если эти поля заполнены/выбраны. Ну и при отправке формы уже все обязательные поля проверяются на заполнение/выбор.
Что сложного то? |
Вы имеете ввиду обработчик, который раскрывает поля при установке флажка? У меня сейчас это примитивный код:
$(document).ready(function() {
$(".public").change(function() {
if ($(this).prop("checked")) {
$(this).parent().next(".hides").fadeIn().show();
return;
} else {
$(this).parent().next(".hides").fadeOut(300);
}
});
})
Сюда надо добавить что-то? |
Я прошу помощи, сам не могу понять как мне сделать так, чтобы он проверял не поля первого выбранного чекбокса, а все остальные выбранные тоже. Сейчас он проверяет только первый. Может как-то в массив нужно все добавлять для проверки?
|
Цитата:
|
Цитата:
<input type="checkbox" name="public" class="public osnova" value="Программа 1"> - я уж молчу о значении этого флажка, бог с ним, но как описано - выбирает пользователь флажок, ему показывается список: <select name="ot_forma1" class="form-control"> <option value="">Форма обучения</option> <option value="Очно-заочная">Очно-заочная</option> ..... в котором он обязательно должен выбрать нечто. Вопрос - зачем проверять обязательность выбора флажка (чем вы заморачиваетесь в коде), зачем его отправлять на сервер, если Программу 1 определяет сам список? Зачем все эти усложнения как html-структуры, так и соответствующего сценария ее обрабатывающего, а также избыточность данных для сервера? |
Цитата:
Мне нужно собрать все названия программ у выбранных флажков и проверить чтобы у выбранных же флажков было обязательно: а) выбрана форма обучения б) написано количество слушателей. Далее все эти данные передаются в форму, которая открывается в модальном окне и потом форма отправляется мне на почту. Поясните мне пожалуйста, как сделать эту задачу легче, буду крайне признателен. |
Цитата:
а) нет никаких у вас модальных окон, модальное окно, это к примеру alert("message"). Модальный диалог, в котором действительно может быть форма есть только у IE. То есть отправка у вас, это еще собственно говоря одна форма, в которую переписывается из другой... Зачем это нужно не понять. б) как отправляются данные на сервер не видно, но я сужу по именам полей в которых производится выбор - name="ot_forma1", и если "однотипные блоки" и отправка по именам, то я предполагаю, что в иных блоках так - name="ot_forma2" и т.д.? А если мое предположение верно, то выбор формы обучения у каждой из программ, это свой уникальный ключ. А если ключ уникален, то флажок самой программы вообще-то излишняя роскошь, ибо пришедшие на сервер ключи форм обучения с успехом могут идентифицировать чему они принадлежат. Данные, а тем более такие как у вас, хранят в базе. Но и хранить их можно по разному. Например каждая запись имеет поле уникального ключа которым как значением и оперируют флажки, не "Программа 1" и т.п. Поле формы обучения как ENUM значения, если у всех программ она одинакова и определяется раз и навсегда. Поле описания программы и еще какие либо данные. Поле содержащее количество слушателей программы. То есть в данном случае все описывается одной sql-таблицей, и у всех программ одни и те же имена полей, которые будут отождествляться с формой, и описаны в форме как ключи массива, а определение кому это принадлежит по значениям, так как они уникальны ибо это идентификаторы. А поступить с таким данными как у вас "ot_forma1", "ot_forma2", "public" не получится, хотя и можно сделать, но это будет сродни геморрою. Если формы обучения есть понятия не постоянные, могут изменяться, добавляться, то они описываются в связанной таблице, что также должно учитываться формой. |
| Часовой пояс GMT +3, время: 19:00. |