Drupal 7: отправка формы через Ajax
Иногда возникает задача на Drupal 7 реализовать отправку статичной формы(не Webform) через Ajax. Как отправить webform через ajax в Drupal7 вы также можете почитать.
Итак, исходные данные:
- Форма с классом form1
- Кастомный модуль custom
JS-код:
(function($) {
Drupal.behaviors.custom = {
attach: function (context, settings) {
$("form.form1", context).submit(function () {
var form = $(this); // запишем форму, чтобы потом не было проблем с this
var error = false; // предварительно ошибок нет, эта переменная нужна на тот случай, если будем делать валидацию на стороне JS
var data = form.serialize(); // подготавливаем данные
if (!error) { // если ошибки нет
var data = form.serialize(); // подготавливаем данные
$.ajax({ // инициализируем ajax запрос
type: 'POST', // отправляем в POST формате, можно GET
url: '/send_message', // путь до обработчика, у нас он лежит в той же папке
dataType: 'json', // ответ ждем в json формате
data: data, // данные для отправки
beforeSend: function(data) { // событие до отправки
},
success: function(data){ // событие после удачного обращения к серверу и получения ответа
if (data.result == "success"){
// тут выполняем какие либо действия, если отправка прошла успешно
} else{
// тут выполняем какие либо действия, если при отправке произошла ошибка
}
},
error: function (xhr, ajaxOptions, thrownError) { // в случае неудачного завершения запроса к серверу
alert(xhr.status); // покажем ответ сервера
alert(thrownError); // и текст ошибки
},
complete: function(data) { // событие после любого исхода
}
});
}
return false;
});
}
};
}(jQuery));
Код PHP. Реализация модуля custom.
/**
* Implementation hook_menu()
*/
function custom_menu() {
$items['send_message'] = array(
'title' => t('Send message'),
'page callback' => 'send_message',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}
function send_message(){
$sendto = [variable_get('site_mail', ''), 'mail@mail.ru'];
$sendto = implode(",", $sendto);
$subject = "Заявка с сайта ".variable_get('site_name', 'Название сайта');
$name = $_POST['name'];
$phone = $_POST['phone'];
$email = $_POST['email'];
$message = $_POST['message'];
$usermail = "info@host.ru";
$headers = "";
$headers .= "From: info".$_SERVER['HTTP_HOST']." \r\n";
$headers .= "Reply-To: ". strip_tags($usermail) . "\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html;charset=utf-8 \r\n";
// Формирование тела письма
$msg = "<body style='font-family:Arial,sans-serif;'>";
$msg .= "<h2 style='font-weight:bold;border-bottom:1px dotted #ccc;'>$subject</h2>\r\n";
if (!empty($name)){
$msg .= "<p><strong>Имя: </strong> ".$name."</p>\r\n";
}
if (!empty($phone)){
$msg .= "<p><strong>Телефон: </strong> ".$phone."</p>\r\n";
}
if (!empty($email)){
$msg .= "<p><strong>E-mail: </strong> ".$email."</p>\r\n";
}
if (!empty($message)){
$msg .= "<p><strong>Сообщение: </strong> ".$message."</p>\r\n";
}
if (!empty($teacher_name)){
$msg .= "<p><strong>Имя преподавателя: </strong> ".$teacher_name."</p>\r\n";
}
$msg .= "</body>
";
// отправка сообщения
if(@mail($sendto, $subject, $msg, $headers)){
$result = array("result" => "success");
print drupal_json_encode($result);
} else{
$result = array("result" => "error");
print drupal_json_encode($result);
}
}
После этого собственно всё отправляется.