ajaxSubmit 1.0 - отправка ajax-запросом данных любой формы MODx
Часто хочется чтобы какая-то веб-форма отправлялась без перезагрузки страницы и при этом чтобы работала проверка заполнения полей и капчи. Ведь по сути в момент когда мы хотим отправить форму нам нужна только эта форма, а всё остальное обновлять нет никакого смысла, тем более, что на это тратится время. Да, можно сделать проверку заполнения полей на JavaScript, а для капчи тоже какие-то скрипты. Но кроме капчи есть другие данные, которые можно проверить только на сервере. Например занято ли имя пользователя, который хочет зарегистрироваться или правильно ли пользователь ввел логин и пароль при авторизации. Тут приходится для каждой такой формы писать отдельные дополнительные PHP- и JS-скрипты. А как было бы удобно, если бы при отправке формы, если поля заполнены не верно, обновлялась бы только эта форма и появлялась информация о проверке заполнения. А что мешает так сделать? Современные средства парсинга HTML на PHP позволяют делать это очень просто.
Идея плагина ajaxSubmit для MODx Evolution состоит в том, чтобы вырезать всё лишнее из содержимого страницы, оставляя только вывод нужного сниппета, при аякс-запросах. Т.е. если страница запрашивается через Ajax (XMLHttpRequest), то выводится только нужный участок HTML-кода. Всё это делается с помощью парсера HTML. В данном плагине используется Zend_Dom_Query.
В комплект ajaxSubmit входит также сниппет, с помощью которого можно быстро настроить отправку формы. Подробная инструкция по установке вложена в архив (ссылка ниже). Сниппет устанавливать не обязательно. Можно написать свою функцию на JavaScript на примере того, что выводит сниппет:
<script type="text/javascript"> <!-- function as_setAction(){ jQuery("#feedbackForm form:first") .unbind('submit') .bind('submit',function(){ jQuery.ajax({ url: window.location.href, type: "post", data: jQuery(this).serialize()+"&ajax_submit=#feedbackForm", dataType: 'html', success: function(response){ if(response=='success' || response.length <= 0){ jQuery("#feedbackForm").html("Спасибо! Ваше письмо отправлено."); }else{ jQuery("#feedbackForm").html(response); } } }); return false; }); } jQuery(document).bind('ready',as_setAction); //--> </script>
Значения полей из формы отправляются через POST этой же странице, которая открыта в данный момент.
Параметры сниппета
- id - идентификатор. Полезно, если сниппет вызывается несколько раз на одной странице.
- noJQuery - Не загружать jQuery (1|0). По умолчанию выключено (0).
- form - селектор (формат CSS) формы. Например: `div.content form`.
- postSignal - имя элемента POST, по которому будет определяться, что нам нужен только отдельный участок HTML-кода, а не вся страница. По умолчанию `ajax_submit`.
- container - селектор контейнера формы.
- msgElem - селектор елемента в котором выводятся сообщения об ошибках заполнения полей.
- msgMinLength - минимальная длина сообщения в msgElem. Если число символов меньше или ровно этому значению, то будет показано сообщение (succesMessage).
- succesMessage - Сообщение, которое будет выведено после удачной отправке формы.
Callback JavaScript функции
as_reqStartCallback() - перед ajax-запросом.
as_reqCompletCallback() - после выволнения ajax-запроса.
as_successCallback() - после завершения отправки формы (нет сообщений проверки заполнения полей).
Если функции с этими именами созданы, они будут вызваны в соответствующий момент. При использовании параметра &id к названиям функций нужно добавить этот ID.
Примеры использования
[[ajaxSubmit? &container=`#feedbackForm`]] <div id="feedbackForm"> [!eForm? &vericode=`1`&formid=`feedbackForm`&tpl=`feedbackForm`&report=`feedbackReport`&subject=`Письмо с сайта`!] </div>
[[ajaxSubmit? &container=`#loginForm`]] <div id="loginForm"> [!WebLogin? &tpl=`weblogin`!] </div>
[[ajaxSubmit? &container=`#loginForm`]] <div id="loginForm"> [!WebLogin? &tpl=`weblogin`!] </div>
[[ajaxSubmit? &form=`#feedbackForm`&msgElem=`div.error`&succesMessage=`Письмо успешно отправлено.`]] [!eForm? &vericode=`1`&formid=`feedbackForm`&tpl=`feedbackForm`&report=`feedbackReport`&subject=`Письмо с сайта`!] <script type="text/javascript"> function as_successCallback(){ $('#feedbackForm').get(0).reset(); } </script> -- чанк "feedbackForm" -- <div class="error">[+validationmessage+]</div> <form id="feedbackForm" method="post" action="[ ~[ *id* ]~ ]"> ... </form>
Теоритически с помощью ajaxSubmit можно отправить "аяксом" форму любого сниппета MODx.
Я проверял на eForm и WebLogin. С точки зрения безопасности не вижу никаких проблем, ведь обращение идет к той же самой странице, а какой тип запроса значения не имеет. Проблемы могут возникнуть только в случае ошибок в HTML-коде, он должен быть валидым. Если в браузере отключен JavaScript, форма тоже будет работать. Рекомендуемая кодировка - UTF-8.
07.09.2011 16:36:07
Иван
Класс, спасибо)))
03.10.2011 20:34:31
Константин
Шикарно, с первого раза все отправилось. Andchir, в очередной раз спасибо за полезный плагин
25.10.2011 03:35:02
Иван
Подскажи, почему у меня при успешной отправке формы выдает сообщение "Данные успешно отправлены. Нет нужды отправлять данные несколько раз."
12.11.2011 02:35:04
Кирилл
Приветствую! Спасибо за замечательный инструмент, частенько пользуюсь. Но вот наткнулся на странный баг - в Opera 11.52 (+jquery 1.6.2) после отправки формы в целевой контейнер грузится вся страница, а не только ответ.
Не подскажете, в чем может быть дело?
З.Ы. http://demo-evo.modx-shopkeeper.ru/ajaxsubmit-demo.html - тут наблюдается та же ошибка.
12.11.2011 13:00:54
Andchir
Кирилл, проверил в Опере 11.52. Описанной вами проблемы не наблюдаю.
12.11.2011 13:44:11
Кирилл
Andchir, действительно - посмотрел сегодня на нескольких других компах с той же версией оперы, все отлично работает, проблемы нет. Буду ковырять настройки браузера - может там чего слетело. Сори за беспокойство.
26.11.2011 02:14:02
Александр
После установки плагина, сервер все время выдает ошибку 500. Отключаешь плагин все нормально, в чем может быть проблема?
26.11.2011 12:35:54
Andchir
Александр, возможно такая причина: http://modx-shopkeeper.ru/forum/viewtopic.php?id=482
Всё можно увидеть в логе ошибок на сервере.
14.12.2011 00:09:02
yos
А есть идеи как реализовать подобное для FormIt? Или направить в нужном направлении.
21.12.2011 13:43:20
Александр
А что если не используя этот плагин, а просто создать ресурс с чистым шаблоном, а к шаблону подцепить снипет который будет обрабатывать результаты и посылать ответ, а в аякс запросе указать эту страницу, так наверное сервер меньше движений будет делать. поправте если неправ.
21.12.2011 14:20:58
Andchir
Ерунду написали. Откуда этот сниппет узнает как ему обрабатывать запрос? Ему нужно узнать все параметры сниппета, который выводит форму, а для этого надо парсить страницу, с которой отправляется запрос. Вот и придём туда откуда начали.
21.12.2011 14:51:58
Александр
Ну у меня он получает данные с этой страницы, уже проверил)))
21.12.2011 14:59:14
Александр
С самим запросом посылать некий индификатор по которому будет снипет знать как обрабатывать данные,
21.12.2011 15:17:24
Andchir
Ага, и любой сможет послать свой идентификатор и вывести всё что угодно. Александр, выложите свой сниппет, посмотрим чем он лучше. Вариантов реализации подобного может быть много. Если вам нравится изобретать велосипеды, изобретайте сколько угодно.
22.01.2012 11:33:08
Akool
А возможно ли на данный обработчик посадить отправку двух (и более) форм с одной страницы?
31.01.2012 21:48:52
Сергей
сделал в первый раз, и всё без бубна помогло, сделал на втором сайте с русскоязычным доменом, в IE не работает(((
06.02.2012 07:26:10
Роман
Все гуд, только AjaxSearch некорректно работает с ним (вызов такой [!AjaxSearch? &ajaxSearch=`0` &landingPage=`131` &showResults=`0` &advSearch=`oneword` !] )
06.02.2012 07:28:06
Роман
Вот что выводится в форме поиска:
AjaxSearch error: Z:/home/u.ru/www/assets/plugins/ajax_submit/configs/default.config.php not found !
Check the existing of this file!
06.02.2012 07:40:12
Роман
Есть ответ на этот вопрос.
В сниппете ajaxSubmit, который на самом деле лежит в плагинах (сниппет инклудит один файл)
есть замечательная строчка define('AS_PATH', ...);
Абсолютно не в курсе зачем она там, но именно из-за неё всё и ломается, потому что она переопределяет AS_PATH, который активно использует ajaxSearch.