AjaxForm MODX в модальном окне
Здравствуй дорогой читатель!
После того, как я написал статью: обратный звонок в модальном окне MODX, посетители моего сайта попросили меня реализовать модальное окно с заказом обратного звонка на сниппете AjaxForm.
Дело в том, что с использованием сниппета AjaxForm, сообщения с сайта отправляются на e-mail без перезагрузки сайта, что очень характерно для модального окна.
Кстати, необходимо знать что AjaxForm - сниппет-обёртка, то есть он не умеет отправлять письма, за него это делает Formit. Так что, помимо сниппета AjaxForm, у Вас должен быть установлен Formit.
На данный момент форма имеет возможности:
- Подсвечивать незаполненные поля красной рамкой и выдавать ошибку
- После отправки сообщения, модальное окно закрывается
- Узнает с какой страницы было отправлено сообщение
Дополнение: несколько форм на одной странице
Вот такое сообщение приходит на почту:
Итак, поехали.
1. Устанавливаем AjaxForm и Formit
Думаю с установкой сниппетов проблем не возникнет. AjaxForm доступен и на modx.com и на modstore.pro
2. Создаем чанк tpl.AjaxForm
После того как установили, в чанках появится категория AjaxForm. В данной категории создаем чанк tpl.AjaxForm:
<form method="post" class="ajax_form af_example">
<input type="hidden" name="title" value="[[*pagetitle]]">
<input type="hidden" name="link" value="[[*uri]]">
<input type="text" placeholder="Как вас зовут?" value="[[+fi.name-zv]]" name="name-zv" id="name" class="input_text form-control"/>
<input type="text" placeholder="Контактный телефон *" name="phone-zv" value="[[+fi.phone-zv]]" id="phone-zv" class="phone-zv form-control"/>
<div class="comment">Поля отмеченные <span class="required">*</span> обязательны для заполнения</div>
<input class="button" type="submit" value="Перезвоните мне">
</form>
Думаю что комментарии не нужны, скажу то, что первые два скрытых поля, получают заголовок и ссылку на текущюю страницу
3. Создаем чанк - шаблон сообщения
Создаем чанк шаблона собщения modal-zv-tpl, которое будет приходить Вам на электронную почту.
<strong>[[+name-zv:empty=`Не заполнено`]]</strong> прислал(а) <strong>заявку на обратный звонок </strong> со страницы: <strong><a href="http://domen.ru/[[+link]]">[[+title]]</a></strong> <br />
Данные с формы:<br />
<p>Имя: <strong>[[+name-zv:empty=`Не заполнено`]]</strong></p>
<p>Телефон: <strong>[[+phone-zv]]</strong></p>
4. Подключаем CSS и JS
В head страницы подключаем modal.css и modal.js, помните что js подключаем после библиотеки jQuery.
Содержимое modal.css
/*Модальное окно*/
#modal_form{width:450px;padding:19px 20px;border:5px solid #00ff95;background-color:#FFF;height:330px;background:#fff;position:fixed;top:45%;left:50%;margin-top:-165px;margin-left:-225px;display:none;opacity:0;z-index:5;}
#overlay{z-index:3;position:fixed;background-color:#000;opacity:0.8;-moz-opacity:0.8;filter:alpha(opacity=80);width:100%;height:100%;top:0;left:0;cursor:pointer;display:none;}
#modal_form input[type="text"]{background-color:#fff;border:1px solid #DFDFDF;border-radius:6px;color:#555;display:block;font-size:1em;height:35px;padding:5px;margin-bottom:17px;width:95%;float:left;}
#modal_form input[type="text"].error{border:1px solid red;}
#modal_form h3{text-align:center;font-size:2em;text-transform:uppercase;color:#000; margin: 0;}
#modal_form .comment{color:#272727;padding-bottom:15px;font-size:14px;text-align:center;padding-top:10px;}
.exit{background:#d0d0d0;display:block !important;border-radius:50%;right:-30px;top:-20px;position:absolute;opacity:1;WIDTH:33PX;HEIGHT:33px;line-height:30px;font-size:36px;border:2px solid #3e5368;-webkit-transition:background 0.2s linear;-moz-transition:background 0.2s linear;-o-transition:background 0.2s linear;transition:background 0.2s linear;}
.exit:after{display:block;font-size:23px;content:"x";padding-left:9px;line-height:24px;cursor:pointer;text-decoration:none;font-weight:bold;color:#000000;-webkit-transition:all 0.2s linear;-moz-transition:all 0.2s linear;-o-transition:all 0.2s linear;transition:all 0.2s linear;}
.exit:hover{background:#EAEAEA;text-decoration:none;}
#modal_form .button{display:block;background-color:#ffd400;border:1px solid #ccc;border-radius:3px;color:#000;cursor:pointer;font-size:17px;font-weight:bold;height:40px;margin:10px 0;padding:2px 16px;width:210px;margin:0 auto;-webkit-transition:all 0.12s ease-in;-o-transition:all 0.12s ease-in;-moz-transition:all 0.12s ease-in;transition:all 0.12s ease-in;}
#modal_form .button:hover{background-color:#44C8F5;border:1px solid #44C8F5;color:#fff;}
#modal_form .error{border:1px solid red;}
Содержимое modal.js
$(function() { // вся мaгия пoсле зaгрузки стрaницы
$('.modal').click( function(event){ // лoвим клик пo ссылки с class="modal"
event.preventDefault(); // выключaем стaндaртную рoль элементa
$('#overlay').fadeIn(400, // снaчaлa плaвнo пoкaзывaем темную пoдлoжку
function(){ // пoсле выпoлнения предъидущей aнимaции
$('#modal_form')
.css('display', 'block') // убирaем у мoдaльнoгo oкнa display: none;
.animate({opacity: 1, top: '50%'}, 200); // плaвнo прибaвляем прoзрaчнoсть oднoвременнo сo съезжaнием вниз
});
});
/* Зaкрытие мoдaльнoгo oкнa, тут делaем тo же сaмoе нo в oбрaтнoм пoрядке */
$('.exit, #overlay').click( function(){ // лoвим клик пo крестику или пoдлoжке
$('#modal_form')
.animate({opacity: 0, top: '45%'}, 200, // плaвнo меняем прoзрaчнoсть нa 0 и oднoвременнo двигaем oкнo вверх
function(){ // пoсле aнимaции
$(this).css('display', 'none'); // делaем ему display: none;
$('#overlay').fadeOut(400); // скрывaем пoдлoжку
}
);
});
$(document).on('af_complete', function(event, response) {
if (response.success) { //Если форма заполнена и нет ошибок
$('#modal_form')
.animate({opacity: 0, top: '45%'}, 500, // плaвнo меняем прoзрaчнoсть нa 0 и oднoвременнo двигaем oкнo вверх
function(){ // пoсле aнимaции
$(this).css('display', 'none'); // делaем ему display: none;
$('#overlay').fadeOut(400); // скрывaем пoдлoжку
});
}
});
});
5. Подключаем и настраиваем AjaxForm
Обычно я подключаем AjaxForm перед закрывающим тегом body.
Здесь находятся параметры сниппета AjaxForm и Formit. Документация на AjaxForm здесь, а Formit здесь.
Не забудьте поменять почту на свою!
<div id="modal_form">
<h3>Заказать звонок!</h3>
<div class="comment">Оставьте заявку и наш специалист свяжется с вами в ближайшее время!</div>
<a class="exit"></a>
[[!AjaxForm?
&snippet=`FormIt`
&hooks=`spam,email`
&emailFrom=`noreply@mail.ru`
&form=`tpl.AjaxForm`
&emailTpl=`modal-zv-tpl`
&emailTo=`mail@mail.ru`
&emailSubject=`Заказ звонка с сайта`
&validate=`phone-zv:required`
&validationErrorMessage=`Пожалуйста, заполните поля помеченные *`
&successMessage=`Сообщение успешно отправлено, наш менеджер свяжеться с Вами в ближайшее время`
]]
</div>
<div id="overlay"></div>
На этом всё. Если у Вас остались вопросы, задавайте через форму ниже.
Помните, если сервер выдаёт ошибку 500 при отправке сообщения, то Вам необходимо проверить параметр register_globals у вашего PHP - он должен быть отключен.
И да, не забудьте поставить ссылку с классом modal
<a href="[[*uri]]#" class="modal">Открыть окно</a>
Дополнение: Как сделать несколько форм на одной страницы?
Здесь принцип такой же, но код JavaScript нужно будет переделать и немного CSS! Вообщем нужно будет в атрибут ссылки href добавлять селектор, который нужно вывести.
К примеру, если мы заходим вывести модальное окно с id="modal_zakaz", то необходимо указать в атрибуте href="#modal_zalaz" или href=".modal_zakaz" если это класс.
Главное помните, что каждое окно должно содержать уникальный атрибут, будь это id или class
Думаю смысл я передал. Итак, приступим:
JS
$(document).ready(function () {
var open_modal = $('.open_modal');
var modal = $('.modal_form');
var close = $('.exit, #overlay');
var overlay = $('#overlay');
open_modal.click(function (event) {
event.preventDefault();
var div = $(this).attr('href'); //узнаем селектор
overlay.fadeIn(400,
function () {
$(div)
.css('display', 'block')
.animate({ opacity: 1, top: '50%' }, 200);
});
});
//закрытие
close.click(function () {
modal // все мoдaльные oкнa
.animate({ opacity: 0, top: '45%' }, 200,
function () {
$(this).css('display', 'none');
overlay.fadeOut(400);
}
);
});
$(document).on('af_complete', function (event, response) {
if (response.success) { //Если форма заполнена и нет ошибок
modal
.animate({ opacity: 0, top: '45%' }, 500,
function () {
$(this).css('display', 'none');
overlay.fadeOut(400);
}
);
}
});
});
Также необходимо изменить в CSS #modal_form на .modal_form так как ID должен быть уникальный.
И ещё, на странице достаточно только одной подложки!!!
<div id="overlay"></div>
Пример вызова нескольких окон
<div class="modal_form" id="modal-1">
<h3>Окно 1!</h3>
<a class="exit"></a>
</div>
<div class="modal_form" id="modal-2">
<h3>Окно 2!</h3>
<a class="exit"></a>
</div>
<a href="[[*uri]]#modal-1" class="open_modal">Открыть окно 1</a>
<a href="[[*uri]]#modal-2" class="open_modal">Открыть окно 2</a>
<div id="overlay"></div> //достаточной одной на всей страницы
Пишите, какие функции необходимо ещё добавить, с радостью разберемся.
Кстати возможно Вас заинтересует: как отправить сообщение с формы в Telegram
P.S. Нехотите возиться? Обращайтесь ко мне, добавлю на Ваш сайт за мороженку :)
03.09.2016 / 150669
Раньше они открывались в модальном окне, сейчас же они на секунду появляются под футером и исчезают. Сообщения при этом уходят нормально. Как будто какой то css или js не отрабатывает, но не могу понять какой.
i.imgur.com/mYDYMEr.png
Все сделал, все получилось. За что вам огромное спасибо!
Стили поправил под себя. Но когда смотрю в коде страницы интересует что значит перед закрывающим тегом form?
Первым делом необходимо указать способ кодирования данных То есть в чанке tpl.AjaxForm пишем: Если одно изображение:
Если более одного:
После этого, форма будет отправлять изображения на почту.
Но, Вам нужно ещё написать кастомный валидатор (в Formit — customValidators) на PHP, который будет проверять расширение загружаемого файла
Согласно требованиям сеошников форма не должна быть в исходном коде страницы.
[[!AjaxForm?
&snippet=`FormIt`
&hooks=`spam,email`
&emailFrom=`моя@почта`
&form=`tpl.AjaxForm`
&emailTpl=`modal-zv-tpl`
&emailTo=`моя@почта`
&emailSubject=`Заказ звонка с сайта`
&validate=`phone-zv:required`
&validationErrorMessage=`Пожалуйста, заполните поля помеченные *`
&successMessage=`Сообщение успешно отправлено, наш менеджер свяжеться с Вами в ближайшее время`
]]
А я пробую прикрутить к вашему модальному окну вход через Login.
В общем, окно работает, вход тоже. Но если в форме ошибки, то окно закрывается. При повторном открытии оно уже с сообщением об ошибке.
Подскажите пожалуйста, как избежать закрытия окна при ошибках?
Получилось? Вы используете AjaxForm в связке с Login?
По идее ошибки должны высвечиваться через
С formit работает, а с login нет((
Нашел вариант без ajaxform, вставил в ваш modal, и все работает. Похоже ajaxform не дружится с login))
Подскажите, пожалуйста, как вывести кнопку звонка в нужном месте и чтобы это была именно кнопка, в вашем варианте получается ссылка, которая все время посередине…
Открыть окно
Спасибо
Вопрос, собственно, по расположению этого самого окна, оно находится в произвольном месте, а при изменении масштаба страницы вообще «уплывает», как сделать, что оно четко располагалась, допустим справа в верхем уголке и там «мертво»сидело?
Спасибо
Ведь, если нужно будет добавить ещё одно модальное окно, то придется лезть в js.
Можно двумя способами, смотреть что указано в href или использовать data-target.
К примеру если указать То нужно вызывать модальное окно с
Ссылка -> клик
буду благодарен за ответ
Данный код рассчитан только на одно модальное окно. Но его можно легко переделать.
Вам просто необходимо изменить код в JS. К примеру, можно ловить значение ссылки в классе modal и открывать это окно.
Тестовый поддомен.
demo.ncworld-show.ru/test-page/
В чем может быть проблема?
Дело в том, что в bootstrap класс modal по умолчанию скрыт, то есть Просто измените класс modal на какой-нибудь другой в html и в JS(где отлавливается событие по клику). Должно заработать.
А в bootstrap.css(где описан класс modal) можно создать новый класс(например modalform) исключив из него display: none;? И потом уже прописать в html и js класс modalform?
По умолчанию AjaxForm выводит сообщения об успешной отправке формы или о наличии ошибок. Вы можете самостоятельно вызывать их для своих целей:
AjaxForm.Message.success('Зеленый popup');
AjaxForm.Message.error('Красный popup', 1);
AjaxForm.Message.info('Черный popup');
как их вызвать в шаблоне???
Необходимо вызывать в JS
Какое именно оповещение Вы хотите сделать?
type: «POST»,
url: url,
data: msg,
success: function(data) {
AjaxForm.Message.success(«Вам выслано письмо со ссылкой для активации рассылки!», { life: 10000, position: 'center' });
}
});
return false;
})
js в этой строке дает ошибку AjaxForm.Message.success
и поддерживайте пожалуйста ветку.
Почему Вам не сделать это на AjaxForm с помощью Formit? Вы ведь используете какое-то API?
Может ещё надо поменять или дописать какой-нибудь параметр?
Это чанк с кнопкой
Чанк: Header.CallBackButton:
Это скрипт modal.js
Это чанк tpl.AjaxForm
Это чанк modal-zv-tpl
Вроде все. Могу ссылку на сайт дать…
Просто в emailForm напишите почту типа no-reply@site.ru
Где site.ru Ваш адрес сайта
Брал пример у MuzZa отсюда — форма закрывается, но не отправляет.
Рад, что моё решение помогло.
Настроил — заработало сразу.
Давно искал подобное.
Сообщение отправляется, но вот форма не закрывается и не появляется сообщение об отправке. Подскажите, пожалуйста, в чем может быть причина?
Закрытие формы происходит в событии (af_complete) в modal.js
1. Попробуйте использовать jQuery v1.7.2
2. Имеется ли в чанке tpl.AjaxForm этот код
Но я думаю проблема с jquery!
Все сделала по вышесказанному. В нужном месте: … Кликаю по ней на сайте, перенаправляется на главную страницу. Что я делаю не так???(((( Неделю мучаюсь.
Чанк формы:
В футере это:
modal.js. Код вставила в свой setting.js
Можете скинуть адрес сайта? Вы делали отладку?
И у меня не приходят письма((( Помогите, пожалуйста!
Установила Ajaxform и formit с установщика Modx
Вызов такой:
/tpl.AjaxForm.example/
/tpl.email/
Еще вопрос такой как реализовать в форме четбоксы кнопки множественного выбора и тому подобное? Возможно это реализовать в этой форме? Спасибо.
Можете прислать код как Вы подключаете AjaxForm?
и чанк modal-zv-tpl
а вывожу чанк таким образом:
В любом случае спасибо вам большое за инструкцию и оперативную поддержку!
Ajax очень удобен. У меня тоже стоит обратная форма с аяксом да и не только она.
А вот с комментариями проблемы.
Может быть Вы сможете подсказать (или написать статью) как можно подключить древовидные комментарии с Аяксом для сайта на MODx.
Буду очень благодарен. Спасибо!
Я могу посоветовать Вам комментарии с помощью компонента tickets.
Если не найду, то, наверное, придется переходить на тикетс.