Как правильно организовать работу с множеством форм на лендинге?
Подскажите, пожалуйста, как организовать работу с несколькими (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, время: 16:32. |