Как правильно организовать работу с множеством форм на лендинге?
Подскажите, пожалуйста, как организовать работу с несколькими (5-10) формами на лендинге? Не как определить, какая именно форма отправляется и т.д., а замешать все в одну функцию, делить функции по типам форм или писать отдельный обработчик для каждой формы?
Вообще, я делаю разные обработчики для разного типа форм. То есть, для формы с полями "Имя" и "Телефон" - свой обработчик, для формы, где "Имя", "Адрес", "Время доставки" - свой. Сомневаюсь в правильности этого... Очень хочется иметь некую универсальную функцию, в которую только передавать id формы, ну может еще какие параметры или это утопия? То, что я пишу сейчас для отправки формы, выглядит так:
function send_order_ring() {
var name = $('#name').val();
var tel = $('#tel').val();
if(name != false && tel != false) {
$.ajax(
{
type: "POST",
url: "templates/script/send-order.php",
data: {'mode': 'order_ring', 'name': name, 'tel': tel},
beforeSend: function() {$('#loader').show();},
success: function(html)
{
$('#loader').hide();
alert('Сообщение об успешной отправке');
},
error: function()
{
alert('Что-то пошло не так. Пожалуйста, попробуйте отправить еще раз!');
}
});
}
}
Подозреваю, что это дикая, устаревшая фигня... Особенно когда на странице 5 разных форм. Тогда получается 5 таких функций, а в php я все это разруливаю по переменной mode - в данном случае, если она == 'order_ring', значит, это заказ звонка. Направьте, пожалуйста, на путь истинный, если я не на нем. :-? |
Можно сделать так:
<form class="async">
<input type="phone" data-type="phone" require/>
<input type="email" data-type="email" require/>
</form>
<script>
$('form.async').submit(function(e){
e.preventDefault();
var $form=$(this);
if($form.find('[require]').toArray().some(function(node){
return !node.value.trim().lenght;
}))
alert('Заполните все обязательные поля');
if($form.find('[data-type]').each(function(){
/*
Тут осуществляется проверка корректности
заполнения поля в зависимости от аттрибута data-type.
В переменную "valid" записывается результат проверки
*/
this.classList[valid?'remove':'add']('invalid');
}).filter('.invalid').length)
return alert('Одно из полей заполненно некорректно');
/*
тут еще 0 или больше проверок чего-либо
и отправка запроса
*/
});
</script>
|
Тут получается универсальная проверка заполненности обязательных полей. А для отправки все равно придется делать раздельный сбор данных из полей, ведь их количество и назначение может быть разным? И как потом на сервере понять, какие поля к какой форме относятся? Думаю, что мой mode не лучшее решение )
|
Цитата:
Цитата:
Если да, то можно отправлять какое-нибудь поле, которое говорило бы о принадлежности данных к конкретной форме. |
Не совсем понял... Вот, например, на лендинге есть 5 форм:
- Заказ звонка (Поля: имя, телефон) - Заказ замера (Поля: имя, телефон, адрес, время) - Заказ доставки (Поля: имя, город, улица, дом, квартира) - Заказ звонка (Еще раз, но по-другому) (Поля: имя, телефон, время для звонка) - Ваш вопрос (Поля: имя, email, тест вопроса) Сейчас я для отправки таких форм пишу 5 отдельных функций, для сбора, валидации и передачи на сервер. Но, возможно, это надо делать короче и проще, в рамках одной функции. Первое, что приходит в голову: - Получить id отправляемой формы - Найти обязательные поля и проверить их заполненность - Получить данные из этих полей - Отправить данные на сервер То есть, получается некая обезличенная функция, которая вроде бы делает то, что нужно. Но: - Как на сервере понять: заказ звонка это или заказ доставки? - Как определить какое поле к чему относится, если даже не понятно, из какой формы это все пришло? Например, если собрать данные через jquery.serialize - кажется, что очень удобно, но как потом дальше определять, что есть что? Или писать развязки в стиле switch-case на сервере? Возможно, я вообще неверно мыслю :) |
<form class="async">
<input type="hidden" name="type" value="a"/>
<input type="phone" data-type="phone" require/>
<input type="email" data-type="email" require/>
</form>
<form class="async">
<input type="hidden" name="type" value="b"/>
<input type="phone" data-type="phone" require/>
<input type="email" data-type="email" require/>
</form>
<form class="async">
<input type="hidden" name="type" value="c"/>
<input type="phone" data-type="phone" require/>
<input type="email" data-type="email" require/>
</form>
<?php
if(!isset($_POST['type']))
exit('Bad request');
$allowed_types=array('a','b','c');
$type=preg_replace('#[^a-z]+?#uim',null,$_POST['type']);
if(!in_array($type,$allowed_types))
exit('Bad request');
/*
Какая форма получена - понятно, дальше нужно вызвать обработчик формы.
*/
|
Да, это интересное решение со стороны сервера.
То есть, смотрим по значению скрытого поля, какая форма пришла, а потом пытаемся получить поля, которые в нее должны входить. Спасибо! |
Цитата:
|
sergey-site,
неоправданно иметь массу отдельных обработчик, для полей имеющих одно и тоже назначение. |
Цитата:
|
| Часовой пояс GMT +3, время: 15:14. |