[AjaxForm] Версия 1.1.0-pl Улучшенная регистрация js

Представляю вам новую версию компонента AjaxForm, который позволяет отправлять любые формы через Ajax.

Внимание, эта версия содержит изменения, которые могут поломать работу сторонних дополнений, использующих AjaxForm. Обязательно проверяйте работу форм после обновления.

AjaxForm очень универсальный, благодаря чему некоторые разработчики используют его в своих дополнениях, но у него есть 2 неприятные особенности:
  1. Он инициализируется один раз для контекста
  2. Соотвественно, он может подключить только один файл javascript
Таким образом получается, что все ajax формы на сайте должны отправляться одним универсальным javascript, что не очень-то подходит для использования в сторонних дополнениях.

Так что, встречайте версию 1.1.0-pl, которая добавляет 2 новых параметра для разработчиков:
  1. &formSelector — Имя CSS класса, который будет использован как jQuery селектор для инициализации формы. По умолчанию «ajax_form».
  2. &objectName — Имя объекта для инициализации в подключаемом javascript. По умолчанию «AjaxForm».
При этом будут подключены все уникальные javascript, указанные в параметре &frontend_js для разных вызовов сниппета.

То есть, теперь можно написать несколько вариантов объекта AjaxForm, положить в разные файлы javascript и вызывать вот так:
[[!AjaxForm]]

[[!AjaxForm?
	&formSelector=`favorites-form`
	&forntend_js=`/assets/.../favorites.js`
	&objectName=`AjaxFavoritesForm`
]]
Первый вызов подключить стандартный AjaxForm с родными скриптами, и запустит его родной объект. А второй вызов загрузит полностью кастомизированный скрипт и запустит уже его объект.

2 разных вызова AjaxForm на странице, с разными настройками и параметрами никак не мешают друг другу работать:


Как вы видите, в javascript больше нет глобального объекта afConfig, общего для всех скриптов. Его заменяет локальная переменная с конфигом, которую каждый экземпляр AjaxForm может использовать на свой лад.

Так что, я советую всем авторам, которые используют AjaxForm в своих дополнениях обновить их с учетом новых возможностей как можно скорее.
И я вам очень прошу, не включайте больше в свои собственные скрипты обрезанный объект AjaxForm, который перезаписывает стандартный.

Все изменения на GitHub.
Василий Наумкин
09 апреля 2015, 07:02
modx.pro
6 693
+2

Комментарии: 27

Пётр Молчанов
09 апреля 2015, 11:09
+1
Обновился. Использую вот так:
[[!AjaxForm?
        	&snippet=`submit_obrazec`
        	&form=`tpl.AjaxForm.obrazec`
        	&successMessage=`Спасибо! Ваша заявка принята.`
        ]]
Теперь после отправки формы страница просто обновляется, т.е. successMessage не выводится, но сама форма работает норм. Я что-то новое забыл дописать?
    Василий Наумкин
    09 апреля 2015, 11:11
    0
    Нужно хорошенько почистить кэш браузера, потому что изменился default.js.

    Ну и проверь ошибки в консоли браузера.
      Пётр Молчанов
      09 апреля 2015, 11:36
      0
      Нужно хорошенько почистить кэш браузера, потому что изменился default.js.
      ок, щас попробую

      Ну и проверь ошибки в консоли браузера.
      первым делом глянул)
        Сергей Фещуков
        12 апреля 2015, 18:49
        0
        Ой, затупил и неправильно воспринял параметр &objectName. Думал для каждой формы отдельно задаётся.
          Василий Наумкин
          12 апреля 2015, 19:40
          0
          При обычном использовании он вообще не нужен — это для сторонних дополнений, или своих расширений.
          Klike
          20 июля 2016, 16:45
          0
          Василий, на один из сайтов пытались атаку провести, и вот что написали:
          Здравствуйте, вот пример одной из критических уязвимостей, называется Blind SQL injection
          POST /assets/components/ajaxform/action.php HTTP/1.1
          Content-Length: 254
          Content-Type: application/x-www-form-urlencoded
          X-Requested-With: XMLHttpRequest
          Referer: http://****.ru:80/
          Host: ******
          Connection: Keep-alive
          Accept-Encoding: gzip,deflate
          User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0
          Accept: */*

          af_action=bd6adf0011d4f266ad2fa3802ff1ed40&email=sample%40email.tst&message=&name=e&pageId=if(now()%3dsysdate()%2csleep(0)%2c0)/*'XOR(if(now()%3dsysdate()%2csleep(0)%2c0))OR'%22XOR(if(now()%3dsysdate()%2csleep(0)%2c0))OR%22*/&workemail=sample%40email.tst
          Как можно обезопасить?
            Василий Наумкин
            20 июля 2016, 17:35
            0
            Исправил, обновись.
              Klike
              12 января 2017, 10:47
              0
              Подскажи, пожалуйста, куда копать: ajaxForm свежий, modx 2.5.4, хостинг modhost. Сохраняю ресурс, открываю сайт, всё хорошо, ajaxForm работает, стили и скрипты подключены. Обновляю страницу –
              Uncaught ReferenceError: AjaxForm is not defined
              И стилей, скриптов нет в коде.
              <link rel="stylesheet" href="/assets/components/ajaxform/css/default.css" type="text/css">
              <script type="text/javascript" src="/assets/components/ajaxform/js/default.js"></script>
              <script src="/assets/components/ajaxform/js/lib/jquery.form.min.js"></script>
              <script src="/assets/components/ajaxform/js/lib/jquery.jgrowl.min.js"></script>
        Александр Янк
        30 апреля 2015, 07:58
        0
        как увеличить время подсказки?
          Александр Комков
          30 апреля 2015, 08:34
          1
          +2
          Подключить свой js файл и добавить сюда:
          $.jGrowl.defaults.life = 10000; // Тут ваше время
          Все параметры jGrowl можно посмотреть здесь
          Володя
          30 апреля 2015, 08:36
          +2
          $.jGrowl(message, {theme: 'af-message-error', sticky: sticky, life: 1000});
          Укажиет life
            Константин Ильин
            08 июня 2015, 12:10
            0
            Подскажите пожалуйста как сделать

            После отправки полям добавляется класс error.
            К примеру у меня error с красным бекграундом, т.е как бы те поля которые не прошли валидацию будут с красными беком.
            Все как бы ок.

            Но если ввести повторно все правильно и поле проходит валидацию error не удаляется. И соответственно поле остается с красным бекграундом.

            В default.js надо что то дописать?

            Хочется сделать выделение неправильных полей, но чет не пойму
          Александр Янк
          30 апреля 2015, 11:13
          0
          Как обрабатывается select?

          Обычная форма работает, а вот добавляю select, то письма не отправляются, и зеленое окошко бьет «сообщение успешно отправлено», но когда удаляю весь select, то письма приходят.

          Поясните, в чем дело, заранее искренне благодарю.

          <div class="secelct-item">
                            <span>Откуда</span>
                            <div class="for-select">
                              <select name="[[+fi.site]]" id="af_clinic" class="form-control">
                              <option>Выберите город</option>
                                <option value="Москва">Москва</option>
                                <option value="Оренбург">Оренбург</option>
                              </select>
                            </div>
                          </div>
            Василий Наумкин
            08 июня 2015, 13:19
            0
            <select name="[[+fi.site]]"
            Зачем имя берётся из, скорее всего, несуществующего плейсхолдера?
            Константин Ильин
            08 июня 2015, 16:36
            0
            По поводу класса error, видимо я пользовался старой версией AF.

            Теперь интересует вопрос.
            У меня несколько разных вызовов AF на 1 странице, они все похожи меняется лиш tpl'ки и валидация
            [[!AjaxForm?
            			&snippet=`FormIt`
            			&form=`main.kalkul.form`
            			&emailTpl=`main.kalkul.sent`
            			&hooks=`spam,email`
            			&emailSubject=`Расчет стоимости ремонта`
            			&emailTo=`[[++emailsender]]`
            			&validate=`name:required,phone1:required,phone2:required,phone3:required,email:email:required,metraj:required,t_pom:required,t_rem:required`
            			&validationErrorMessage=`В форме содержатся ошибки!`
            			&successMessage=`Сообщение отправлено!`
            		]]
            Страница загрузилась, ничего не делая стразу заполняю форму по валидации, оправляю, ошибок не выдает, но пишет, что форма успешно отправлена, а ведь должен &successMessage=`Сообщение отправлено!` и не приходит письмо. Ничего не делая, пробую ту же форму еще раз, теперь все как надо и письмо приходит.
            Далее ничего опять не делая, иду к другой форме там все так же и другие формы так же.

            modx 2.3.2
            jquery-1.11.1.min.js(все сторонние скрипты пробовал убирать так же)
            AF и FormIt последний
            кеш браузера чистил(default.js)
            консоль браузера чиста
            некеш AF пробовал
            пробовал 1 вызов на странице так же
            дошло до того, что w3c валидацию прошел(а вдруг!:)

            по поводу селектов и чеков тоже интересно
            пробовал так(т.к. AF обертка):
            rtfm.modx.com/extras/revo/formit/formit.tutorials-and-examples/formit.examples.simple-contact-page
            <label><input type="checkbox" name="diz_proj" value="Нет" class="checkbox" [[!+fi.diz_proj:FormItIsChecked=`Да`]]/> Разработать дизайн проект</label>
            всегда приходит нет
              Константин Ильин
              09 июня 2015, 10:56
              0
              Ребят есть какие либо догадки почему так происходит??
                Константин Ильин
                09 июня 2015, 14:34
                0
                Василий, я решил проблему сам, но обращаюсь к вам.

                проблема была в одно поле input
                <input type="text" name="phone1" maxlength="2" class="input placeholder" disabled value="+7">
                Стоял атрибут disabled у поля, т.е. при отправке AF считал, что у него состояние disabled(которое насколько я помню использует AF перед отправкой), но после того как нажимаешь на кнопку у него этот атрибут исчезает(вроде видел в js, что AF его удаляет). phone1 у меня был обязательным.

                вот такой несуразный момент огорчил меня вчера до этого момента.

                ошибка это или нет, я не знаю, решил просто удалить этот атрибут и все заработало.
                  Василий Наумкин
                  09 июня 2015, 14:37
                  0
                  Ну основы HTML-то нужно знать. Внимание, атрибут disabled.
                  Блокирует доступ и изменение поля формы. Оно в таком случае отображается серым и недоступным для активации пользователем. Кроме того, такое поле не может получить фокус путем нажатия на клавишу Tab, мышью или другим способом. Тем не менее, такое состояние поля можно менять с помощью скриптов.Заблокированное в поле значение не передается на сервер.
                    Константин Ильин
                    09 июня 2015, 14:39
                    +1
                    капец я молодец… Спасибо!
                      Константин Ильин
                      13 июня 2015, 17:11
                      0
                      Василий, а как бороться с тем, что если Чекбокс не отмечен на почту это поле приходило как «Нет»?
                      value=«нет» не катит)
                      Ато вместо этого приходит плейсхолдер
                        Константин Ильин
                        13 июня 2015, 17:32
                        +1
                        Догадался =)
                        Через модификатор, в чанке письма

                        [[+title:default=`Нет`]]
              Константин Ильин
              12 июня 2015, 22:04
              0
              Вопрос по поводу своих сниппетов
              Хочу сделать сниппет в котором вызывается pdoResources и ему передается limit. Т.е. на странице пару ресурсов загрузилось сразу, снизу кнопка показать еще, нажав на нее подгружаются еще ресурсы к примеру еще 3, нажав еще раз а ресурсов больше нет выдать «Больше нет»

              «Простая» подгрузка ресурсов через аякс, хочется сделать через AF и по феншую так сказать, надо все таки кодить правильно и грамотно.

              Я правильно думаю и реально такое? если есть пример такого буду очень благодарен! наводки тоже будет здорово!
              Константин Ильин
              20 ноября 2015, 16:34
              0
              Вопрос(не претензия):
              А это так и должно быть, что при каждой отправке формы в form добавляются безымянные input[hidden]
              т.е. 10 раз нажал на отправить, 10 создалось.

              на 2-х сайтах смотрел, тоже так же.
                Максим
                18 февраля 2017, 16:14
                0
                Доброго времени суток. Подскажите пожалуйста как можно отключить очистку полей после отправки?
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  27