Обратный звонок в модальном окне MODx

Модальное окно для 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 / 80865