Обратный звонок в модальном окне MODx
Всем привет!
Я, частный вебмастер и иногда у меня случается так, что нужно быстро прикрепить к сайту на MODx - форму обратного звонка, но использовать готовые снипеты не хочется, поэтому я решил создать эту статью для быстрого решения простой формой обратного звонка для MODx revo с использованием снипета Formit.
P.S. Если хотите сделать обратный звонок с использованием Ajax (без перезагрузки страницы), то вот новая статья - AjaxForm MODX в модальном окне
Для начала необходимо установить сниппет Formit, дабы получать сообщения.
Установили? пойдём дальше.
Давайте создадим html структуру окна:
<div id="modal_form">
<h2>Заказать звонок!</h2>
<div class="comment">Оставьте Ваши данные и мы перезвоним Вам!</div>
<a class="exit"></a>
<form method="post">
<input type="text" placeholder="Как вас зовут?" name="name-zv" id="name" class="input_text">
<input type="text" placeholder="Контактный телефон *" name="phone-zv" id="phone-zv" class="phone-zv">
<div class="comment">Поля отмеченные <span class="required">*</span> обязательны для заполнения</div>
<input class="button" type="submit" value="Перезвоните мне">
</form>
</div>
<div id="overlay"></div><!-- Пoдлoжкa -->
Отлично! Дальше идёт CSS modal.css
#modal_form {
width: 350px;
height: 270px; /* Рaзмеры дoлжны быть фиксирoвaны */
border-radius: 5px;
background: #fff;
position: fixed; /* чтoбы oкнo былo в видимoй зoне в любoм месте */
top: 45%; /* oтступaем сверху 45%, oстaльные 5% пoдвинет скрипт */
left: 50%; /* пoлoвинa экрaнa слевa */
margin-top: -135px;
margin-left: -175px; /* тут вся мaгия центрoвки css, oтступaем влевo и вверх минус пoлoвину ширины и высoты сooтветственнo =) */
display: none; /* в oбычнoм сoстoянии oкнa не дoлжнo быть */
opacity: 0; /* пoлнoстью прoзрaчнo для aнимирoвaния */
z-index: 5; /* oкнo дoлжнo быть нaибoлее бoльшем слoе */
padding: 20px 10px;
}
/* Пoдлoжкa */
#overlay {
z-index:3; /* пoдлoжкa дoлжнa быть выше слoев элементoв сaйтa, нo ниже слoя мoдaльнoгo oкнa */
position:fixed; /* всегдa перекрывaет весь сaйт */
background-color:#000; /* чернaя */
opacity:0.8; /* нo немнoгo прoзрaчнa */
-moz-opacity:0.8; /* фикс прозрачности для старых браузеров */
filter:alpha(opacity=80);
width:100%;
height:100%; /* рaзмерoм вo весь экрaн */
top:0; /* сверху и слевa 0, oбязaтельные свoйствa! */
left:0;
cursor:pointer;
display:none; /* в oбычнoм сoстoянии её нет) */
}
/* Стили для поля ввода */
#modal_form input[type="text"] {
background-color: #fff;
border: 1px solid #c0c0c0;
border-radius: 1px;
color: #555;
display: block;
font-size: 1em;
height: 30px;
padding: 5px;
margin-bottom: 17px;
width: 95%;
float: left;
}
/* Стилия для заговка и надписей */
#modal_form h2{
text-align: center;
}
#modal_form .comment {
color: #797979;
padding-bottom: 15px;
font-size: 12px;
}
/* Кнопка закрыть */
.exit {
position: absolute;
top: 5px;
right: 5px;
width: 28px;
height: 28px;
text-decoration: none;
-webkit-border-radius: 50%;
border-radius: 50%;
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: 28px;
content: "x";
padding-left: 7px;
line-height: 26px;
cursor: pointer;
text-decoration: none;
color: #3e5368;
-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: #DCDCDC;
}
/* Кнопка отправить */
#modal_form .button {
display: block;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 3px;
color: #555;
cursor: pointer;
font-size: 14px;
font-weight: bold;
height: 34px;
margin: 10px 0;
padding: 2px 16px;
width: 185px;
margin: 0 auto;
}
#modal_form .button:hover {
background-color: #4683ea;
border: 1px solid #4387fd;
color: #fff;
}
А вот и наш 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жку
}
);
});
});
Со скриптом всё ясно, сначала мы создаём крутой эффект с помощью animate изменяя прозрачность(opacity) и пoзицию пo вертикaли(top).
Теперь у нас есть готовый скрипт модального окна и стили для него, теперь нам ничего не мешает прикрутить его к MODx revo.
Для начала подключаем в head modal.css и modal.js, да не забываем про jquery, иначе скрипт работать не будет.
Теперь создадим чанк modal с нашей html структурой, но ещё добавим снипет formit, в итоге получится так:
[[!FormIt?
&hooks=`spam,email,redirect`
&emailTpl=`modal-zv-tpl`
&emailTo=`mail@mail.ru`
&emailSubject=`Заказ обратного звонка`
&redirectTo=`33`]]
<div id="modal_form">
<h2>Заказать звонок!</h2>
<div class="comment">Оставьте Ваши данные и мы перезвоним Вам!</div>
<a class="exit"></a>
<form method="post">
<input type="text" placeholder="Как вас зовут?" name="name-zv" id="name" class="input_text">
<input type="text" placeholder="Контактный телефон *" name="phone-zv" id="phone-zv" class="phone-zv">
<div class="comment">Поля отмеченные <span class="required">*</span> обязательны для заполнения</div>
<input class="button" type="submit" value="Перезвоните мне">
</form>
</div>
Сначала вызываем Formit, дальше указываем чанк обработчика &emailTpl=`modal-zv-tpl`, дальше почту, тему и куда перенаправлять после успешной отправки.
Теперь создадим наш шаблон modal-zv-tpl для обработчика formit.
<strong>[[+name-zv]]</strong> просит Вас <strong>перезвонить!</strong> <br />
Данные с формы:<br />
<p>Имя: <strong>[[+name-zv]]</strong></p>
<p>Тел.: <strong>[[+phone-zv]]</strong></p>
На этом всё. Если у Вас остались вопросы, задавайте через форму ниже.
Для проверки заполнений, могу написать скрипт, который проверяет форму, так как проверка которая осуществляется с помощью Formit приводит к перезагрузке страницы, а также как добавить маску, чтобы пользователю было удобно вводить телефон
Кстати возможно Вас заинтересует: как отправить сообщение с формы в Telegram
Если у Вас не получается установить, свяжитесь со мной и я установлю Вам за приемлемую стоимость.
*В демонстрации форма не отправляет сообщения
23.01.2016 / 68250
Добавил в форму модального окна код для полей эл. почты:
и письма пошли! У меня даже из чанка, который содержит форму обратного письма нет ничего по эл. почте.
И что с этим делать?
[[!+fi.error.email]] />
Либо полностью это:
Почта-обязательно!
[[!+fi.error.email]] />
ПОДСКАЖИТЕ, ПОЖАЛУЙСТА, КАК ВЫЙТИ ИЗ ПОЛОЖЕНИЯ?
В вызове сниппета дописал: &validate=`name:required,phone:required`
И в html-код формы в строке каждого из полей: required />
Теперь окно кнопкой не закроешь, пока хоть одно поле не заполнено!
"… Сначала вызываем Formit, дальше указываем чанк обработчика &emailTpl=`modal-zv-tpl`, дальше почту, тему и куда перенаправлять после успешной отправки..."
и встал.
Очень нужна ваша помощь/консультация. Все вопросы отправил на почту. Подскажите, пожалуйста, как действовать дальше.
Может Вы сможете мне помочь? голову сломал уже.
Поставил обратную связь с помощью ajaxForm письма отправляются, но при этом перезагружается страница и не появляются оповещения об успешном отправлении. Неудобно тем что форма внизу сайта, а после перезагрузки возвращается вверх.
в консоли ошибка default.js:11 Uncaught TypeError: $ is not a function
Это тестовая страница. Подскажите пожалуйста что не так?
Сайт закрыли, дальше не успел посмотреть
Я был бы Вам очень признателен
Вот так выглядит код кнопки. Может быть в ней дело. Думаю, что-то другое надо писать вместо решётки, не пойму только, что…:
Вызов будет примерно такой:
В данном случае чанк — tpl.AjaxForm:
$(document).on('af_complete', function(event, response) {
var form = response.form;
// Если у формы определённый id
if (form.attr('id') == 'my_form_3') {
// Скрываем её!
form.hide();
}
// Иначе печатаем в консоль весь ответ
else {
console.log(response)
}
});
docs.modx.pro/components/ajaxform#Событие-af_complete
И еще один момент вчера сайту был открыт доступ и с утра 2000 сообщений с модального окна не заполненные в чем проблема подскажите? Сейчас вроде все проверки поправил но не знаю верно или нет.
Сайт
Сделал по коду приведенному выше (В данном случае чанк — tpl.AjaxForm: