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); } }

После этого собственно всё отправляется.

Тэги:

Тэг в списке: