Сегодня я покажу, как сделать форму обратной связи, с отправкой данных через ajax, использованием стандартных модальных окон битрикса, проверкой captcha и прочими фишками.
Форма будет выводиться через механизм включаемых областей. Для этого разместим на любой странице вот такой код (я это сделал на странице контакты):
<? $APPLICATION->IncludeFile( SITE_DIR."include/feedback_form.php", Array(), Array("MODE"=>"html") ); ?>
Затем, в папку /include поместим файлы feedback_form.php и send.php со следующим содержимым:
feedback_form.php
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <? $code = $APPLICATION->CaptchaGetCode(); ?> <form action="" method="post" class="feedback_form"> <div class="item"> <label>Имя:</label><input type="text" name="name" value="" required /> </div> <div class="item"> <label>E-mail:</label><input type="text" name="email" value="" required /> </div> <div class="item"> <label>Текст сообщения:</label><textarea name="message" required></textarea> </div> <div class="item"> <label>Введите символы с картинки:</label> <img src="/bitrix/tools/captcha.php?captcha_sid=<?=$code;?>" alt="CAPTCHA" width="120" class="captcha_img" /> <br /> <a href="#" rel="nofollow" class="update">обновить картинку</a> <br /> <br /> <input type="hidden" name="captcha_sid" value="<?=$code;?>" /> <input type="text" name="captcha_word" value="" required/> </div><!-- captcha-holder --> <input type="submit" value="Отправить" /> </form> <div class="schema"></div> <? CJSCore::Init(array("jquery", "popup")); ?> <script> $(document).ready(function() { $('.update').on('click', function(){ $.ajax({ url: '/include/send.php', type: 'post', data: 'get=captcha', success: function(data){ $('.feedback_form .captcha_img').attr('src', '/bitrix/tools/captcha.php?captcha_sid=' + data); $('.feedback_form input[name="captcha_sid"]').val(data); } }); return false; }); $('.feedback_form').on('submit', function(){ var name = $('input[name="name"]').val(); var email = $('input[name="email"]').val(); var message = $('textarea[name="message"]').val(); var captcha_word = $('input[name="captcha_word"]').val(); var captcha_sid = $('input[name="captcha_sid"]').val(); $.ajax({ url: '/include/send.php', type: 'post', data: 'get=send&name='+name+'&email='+email+'&message='+message+'&captcha_word='+captcha_word+'&captcha_sid='+captcha_sid, success: function(data){ var popup = new BX.CDialog({ 'title': 'Отправка формы', 'content': data, 'draggable': true, 'resizable': false, 'width':250, 'height':200, 'buttons': [BX.CDialog.btnClose] }); popup.Show(); } }); return false; }); }); </script>
send.php
<? require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php"); if($_REQUEST['get'] == 'captcha') { echo $code = $APPLICATION->CaptchaGetCode(); } if($_REQUEST['get'] == 'send') { $error = ''; if(!$APPLICATION->CaptchaCheckCode($_REQUEST['captcha_word'], $_REQUEST['captcha_sid'])) $error .="Рисунок с картинки введен неверно<br />"; if($_REQUEST['name']=='') $error .="Заполните поле \"имя\"<br />"; if($_REQUEST['email']=='') $error .="Заполните поле \"email\"<br />"; if($_REQUEST['message']=='') $error .="Заполните текст сообщения<br />"; if($error) echo "<span style='color:#ff0000;'>".$error."</span>"; else { $arEventFields = array( "NAME" => $_REQUEST['name'], "EMAIL" => $_REQUEST['email'], "MESSAGE" => $_REQUEST['message'], ); if(CEvent::Send("FEEDBACK_SEND", array(SITE_ID), $arEventFields)) echo "<span style='color:#0fcf00;'>Сообщение успешно отправлено!</span>"; else echo "<span style='color:#ff0000;'>Ошибка почтового сервера!</span>"; } } ?>
В файле feedback.php при успешном получении данных через ajax появляется стандартное модальное окно:
var popup = new BX.CDialog({ 'title': 'Отправка формы', 'content': data, 'draggable': true, 'resizable': false, 'width':250, 'height':200, 'buttons': [BX.CDialog.btnClose] }); popup.Show();
в котором пишется результат отправки формы, или же ошибка.
Для того, чтобы это сработало, выше в коде мы инициализируем jquery и библиотеку для работы с модальными окнами:
CJSCore::Init(array("jquery", "popup"));
Также здесь присутствует обработчик клика по ссылке «обновить картинку» - если подгрузилась нечитаемая картинка капчи.
$('.update').on('click', function(){ $.ajax({ url: '/include/send.php', type: 'post', data: 'get=captcha', success: function(data){ $('.feedback_form .captcha_img').attr('src', '/bitrix/tools/captcha.php?captcha_sid=' + data); $('.feedback_form input[name="captcha_sid"]').val(data); } });
В случае, если все поля заполнены правильно, данные ajax’ом передаются в send.php, и затем вызывается событие FEEDBACK_SEND.
Добавим украшательства – зайдем в папку шаблона (/bitrix/templates/имя_шиблона/) файл template_styles.css, в конец добавим код:
.feedback_form{ display:block; width:400px; border:solid 1px #ccc; border-radius:5px; padding:10px; } .feedback_form .item{ margin-bottom:10px; width:100%; float:left; } .feedback_form .item label{ display:block; width:150px; float:left; } .feedback_form .item input[type='text'], .feedback_form .item textarea{ width:200px; float:right; } .feedback_form .item textarea{ height:200px; }
Создание почтового события
Теперь создадим почтовое событие и шаблон для него. Для этого в админке битрикса перейдем в настройки – почтовые шаблоны – типы почтовых событий, и нажмем добавить тип:Cозадим тип почтового события FEEDBACK_SEND.
Далее переходим в почтовые шаблоны, и создаем новый почтовый шаблон для события битрикса FEEDBACK_SEND:
Всё готово. Форма должна работать.