あくまで自分用の覚え書きなので文章とか適当です...

ついでにフォームコーディングとバリデーションも

jQuery + Ajax

https://api.jquery.com/jQuery.ajax/

jQuery(function($){

	$contactForm = $('#contact-form');

	// バリデーション

	// JSONデータ送信
	$contactForm.submit(function(ev) {
		ev.preventDefault();

		var data = {
			contact_type: $('input[name="contact_type"]').val(),
			nickname: $('input[name="nickname"]').val(),
			xxx: [{
				xxxx: $('input[name="address.postcode"]').val(),
				xxxx: $('input[name="address.prefecture"]').val(),
			}]
		}

		$.ajax({
			method: "POST",
			url: "https://jsonplaceholder.typicode.com/posts", //ダミーに使えるオンラインサービスURL
			// url: "./receive.php",
			dataType: 'json',
			contentType: 'application/json',
			data: JSON.stringify(data)
		})
		.done(function(data) {
			alert(JSON.stringify(data));
			window.location.href = "/contact/thankyou/";
		})
		.fail(function(err) {
			window.location.href = "/contact/error/";
		});
	});
});

receive.php

<?php
$json = file_get_contents( 'php://input' );
echo $json;

ajaxを介して管理者へメールを送信する場合

jQuery

  jQuery('input.validate, textarea.validate, select.validate').each(function () {
    $this = jQuery(this);

    //バリデーション

  // --- JSONデータ送信 ---
  var originalData = {
    family_name: jQuery('input[name="family_name"]').val(), //お名前(姓)
    first_name: jQuery('input[name="first_name"]').val(), //お名前(名)
  };

	// 外部フォームへの送信処理
    jQuery
      .ajax({
        method: "POST",
        url: "https://jsonplaceholder.typicode.com/posts",
        dataType: 'json',
        contentType: 'application/json',
        data: JSON.stringify(originalData),
      })
      .done(function (apiResponse) {
        sendEmail(originalData);
      })
      .fail(function (jqXHR, textStatus, errorThrown) {
        window.location.href = homeurl + 'contact/error/';
      });

  // メール送信
  function sendEmail(data) {
    jQuery.ajax({
        method: "POST",
        url: "/sendmail/index.php",
        data: data
    })
    .done(function(response) {
        window.location.href = 'contact/thankyou/';
    })
    .fail(function (jqXHR, textStatus, errorThrown) {
        window.location.href = 'contact/error/';
    });
  }
});

/sendmail/index.php

サイトのルートに置く

<?php
// お問い合わせフォームから送られたデータ(姓&名)を管理者メールアドレスに送信
// フォームはform-contact.phpに記述
// 入力されたフォームデータ(姓&名)は /assets/js/contact.js を介して受信

mb_language( 'Japanese' );
mb_internal_encoding( 'UTF-8' );

if ( 'POST' === $_SERVER['REQUEST_METHOD'] ) {
	$family_name = htmlspecialchars( $_POST['family_name'] ?? '', ENT_QUOTES, 'UTF-8' );
	$first_name  = htmlspecialchars( $_POST['first_name'] ?? '', ENT_QUOTES, 'UTF-8' );

	$to       = 'admin@example.com';
	$subject  = 'example.comに問合わせがありました';
	$message  = "以下の氏名で問い合わせがありました。\n \n氏名 $family_name $first_name";
	$headers  = "From: no-reply@example.com\r\n";
	$headers .= "Reply-To: no-reply@example.com\r\n";
	$headers .= 'X-Mailer: PHP/' . phpversion();

	mail( $to, $subject, $message, $headers );
}

JavaScriptのfetch() メソッド使う方法

const formEl = document.querySelector('.form');
formEl.addEventListener('submit', event => {
	event.preventDefault();

	const formData = new FormData(formEl);
	const data = Object.fromEntries(formData);

	fetch('https://reqres.in/api/users', {
		method: 'POST',
		headers: {
			'Content-Type': 'application/json'
		},
		body: JSON.stringify(data)
	})
	.then(res => res.json())
	.then(data => console.log(data))
	.catch(error => console.log(error));
});

AXIOS を使う方法

formEl.addEventListener('submit', event => {
	event.preventDefault();

	const formData = new FormData(formEl);
	const data = Object.fromEntries(formData);
	axios.post('https://reqres.in/api/users', data)
	.then(function (response) {
		console.log(response.data);
	})
	.catch(error => console.log(error));
});

HTTP レスポンスステータスコード

情報レスポンス (100–199)
成功レスポンス (200–299)
リダイレクトメッセージ (300–399)
クライアントエラーレスポンス (400–499)
サーバーエラーレスポンス (500–599)

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

スポンサーリンク