Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Валидация формы работает не совсем так (https://javascript.ru/forum/events/66065-validaciya-formy-rabotaet-ne-sovsem-tak.html)

Batyabest 23.11.2016 10:43

Валидация формы работает не совсем так
 
Здравствуйте.
Есть форма, состоящая из ряда одинаковых блоков
<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();
	});
});


Но на практике форма состоит не из одного блока а из многих. И если хотя бы в одном из них данные по форме обучения и количеству слушателей выбраны, то на остальные валидация не реагирует и форма проходит валидацию.
Как сделать чтобы проверялись все поля у выбранных чекбоксов?

Batyabest 24.11.2016 10:19

Помогите, пожалуйста. Все уже перепробовал, не получается правильно сделать валидацию все select и input из выбранных checkbox.

laimas 24.11.2016 16:20

Полям обязательным к заполнению добавьте атрибут required и браузер сам не разрешит отправку формы при незаполненных. А уже скрпту получить коллекцию этих полей и проверить их заполнение после trim.

Batyabest 24.11.2016 17:42

Цитата:

Сообщение от laimas (Сообщение 436060)
Полям обязательным к заполнению добавьте атрибут required и браузер сам не разрешит отправку формы при незаполненных. А уже скрипту получить коллекцию этих полей и проверить их заполнение после trim.

Проблема в том, что это не совсем форма. Она не обернута в теги <form></form>
По сути это просто набор div'ов а все действо происходит по нажатию на ссылку с классом podtv
А вот уже потом открывается модальное окно с формой, в которую переданы выбранные данные и там уже пользователь вводит имя, телефон и т.д. и отправляет.
Мне же нужно, чтобы даже модалка не открывалась и вылезало сообщение если в каком-либо из выбранных чекбоксов не выбрана форма обучения или не проставлено количество слушателей.
Если нужно, могу полный код выложить.

laimas 24.11.2016 19:46

Цитата:

Сообщение от Batyabest
Проблема в том, что это не совсем форма.

Это не есть проблема, добавить атрибут можно любому тегу.

else if (numprogblock == '') {
alert('Введите количество слушателей!');
}


А "помечаем" нужные нам элементы (которые обязательно должны быть выбраны), в атрибутах их же можно описать и правила/текст, чтобы не лепить на каждый блок свои проверки и не дай бог свои обработчики.

В конечном же итоге сервер будут ожидать поля, которые судя по условию должны быть обязательно заполнены/выбраны, а уж в каком порядке это было сделано на клиенте, так это не так и важно.

Batyabest 24.11.2016 19:51

Цитата:

Сообщение от laimas (Сообщение 436100)
Это не есть проблема, добавить атрибут можно любому тегу.

else if (numprogblock == '') {
alert('Введите количество слушателей!');
}


А "помечаем" нужные нам элементы (которые обязательно должны быть выбраны), в атрибутах их же можно описать и правила/текст, чтобы не лепить на каждый блок свои проверки и не дай бог свои обработчики.

В конечном же итоге сервер будут ожидать поля, которые судя по условию должны быть обязательно заполнены/выбраны, а уж в каком порядке это было сделано на клиенте, так это не так и важно.

А как это в коде сделать? Подскажите примерчиком, а то не допетрю сам...

laimas 24.11.2016 20:18

Точно также как например определить один обработчик на несколько элементов. То есть флажки или иное имеют один обработчик, который раскрывает следующие поля для выбора. А данным полям как-то <select name="ot_forma1" class="form-control"> атрибут required - <select name="ot_forma1" class="form-control" required>. Если запрашивается на раскрытие полей, то проверяется есть ли у запрашиваемого блока предыдущий и если есть, то получить все поля с атрибутом required, и открыть блок только в том случае, если эти поля заполнены/выбраны. Ну и при отправке формы уже все обязательные поля проверяются на заполнение/выбор.

Что сложного то?

Batyabest 24.11.2016 20:29

Вы имеете ввиду обработчик, который раскрывает поля при установке флажка? У меня сейчас это примитивный код:
$(document).ready(function() { 
    $(".public").change(function() { 
        if ($(this).prop("checked")) { 
            $(this).parent().next(".hides").fadeIn().show(); 
            return; 
        } else { 
             $(this).parent().next(".hides").fadeOut(300); 
        } 
    }); 
})


Сюда надо добавить что-то?

Batyabest 25.11.2016 11:49

Я прошу помощи, сам не могу понять как мне сделать так, чтобы он проверял не поля первого выбранного чекбокса, а все остальные выбранные тоже. Сейчас он проверяет только первый. Может как-то в массив нужно все добавлять для проверки?

Batyabest 25.11.2016 11:50

Цитата:

Сообщение от laimas (Сообщение 436107)
Точно также как например определить один обработчик на несколько элементов. То есть флажки или иное имеют один обработчик, который раскрывает следующие поля для выбора. А данным полям как-то <select name="ot_forma1" class="form-control"> атрибут required - <select name="ot_forma1" class="form-control" required>. Если запрашивается на раскрытие полей, то проверяется есть ли у запрашиваемого блока предыдущий и если есть, то получить все поля с атрибутом required, и открыть блок только в том случае, если эти поля заполнены/выбраны. Ну и при отправке формы уже все обязательные поля проверяются на заполнение/выбор.

Что сложного то?

Атирибут required работает на формах, у меня нет формы есть просто дивы.

laimas 25.11.2016 13:39

Цитата:

Сообщение от Batyabest
Атирибут required работает на формах

Да хоть mainattr назовите его, какая разница. Вот что вы делаете:

<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-структуры, так и соответствующего сценария ее обрабатывающего, а также избыточность данных для сервера?

Batyabest 25.11.2016 19:09

Цитата:

Сообщение от laimas (Сообщение 436195)
Вопрос - зачем проверять обязательность выбора флажка (чем вы заморачиваетесь в коде), зачем его отправлять на сервер, если Программу 1 определяет сам список?

Зачем все эти усложнения как html-структуры, так и соответствующего сценария ее обрабатывающего, а также избыточность данных для сервера?

А я разве проверяю обязательность выбора флажка? и как список определяет программу?
Мне нужно собрать все названия программ у выбранных флажков и проверить чтобы у выбранных же флажков было обязательно:
а) выбрана форма обучения
б) написано количество слушателей.

Далее все эти данные передаются в форму, которая открывается в модальном окне и потом форма отправляется мне на почту.

Поясните мне пожалуйста, как сделать эту задачу легче, буду крайне признателен.

laimas 26.11.2016 02:07

Цитата:

Сообщение от Batyabest
А я разве проверяю обязательность выбора флажка?

Это нужно будет делать обязательно на сервере, но если ...

а) нет никаких у вас модальных окон, модальное окно, это к примеру alert("message"). Модальный диалог, в котором действительно может быть форма есть только у IE. То есть отправка у вас, это еще собственно говоря одна форма, в которую переписывается из другой... Зачем это нужно не понять.

б) как отправляются данные на сервер не видно, но я сужу по именам полей в которых производится выбор - name="ot_forma1", и если "однотипные блоки" и отправка по именам, то я предполагаю, что в иных блоках так - name="ot_forma2" и т.д.? А если мое предположение верно, то выбор формы обучения у каждой из программ, это свой уникальный ключ. А если ключ уникален, то флажок самой программы вообще-то излишняя роскошь, ибо пришедшие на сервер ключи форм обучения с успехом могут идентифицировать чему они принадлежат.

Данные, а тем более такие как у вас, хранят в базе. Но и хранить их можно по разному. Например каждая запись имеет поле уникального ключа которым как значением и оперируют флажки, не "Программа 1" и т.п. Поле формы обучения как ENUM значения, если у всех программ она одинакова и определяется раз и навсегда. Поле описания программы и еще какие либо данные. Поле содержащее количество слушателей программы.

То есть в данном случае все описывается одной sql-таблицей, и у всех программ одни и те же имена полей, которые будут отождествляться с формой, и описаны в форме как ключи массива, а определение кому это принадлежит по значениям, так как они уникальны ибо это идентификаторы. А поступить с таким данными как у вас "ot_forma1", "ot_forma2", "public" не получится, хотя и можно сделать, но это будет сродни геморрою.

Если формы обучения есть понятия не постоянные, могут изменяться, добавляться, то они описываются в связанной таблице, что также должно учитываться формой.


Часовой пояс GMT +3, время: 10:05.