本記事では、ver.2.35でリリースされたカスタムAPIを活用して、非同期通信を用いたシンプルなデータ検証システムを実装する方法をご紹介します。
この仕組みでは、ユーザが入力したテキストをカスタムAPIのPHPで検証し、その結果をフロントエンドで即時にフィードバックすることが可能です。
今回のサンプルでは、固定値との一致確認を例にしていますが、実際にはデータベース照合や外部APIとの連携など、より複雑な検証ロジックを組み込むこともできます。
以下、各パートごとにコード例とその解説を掲載していますので、ぜひご参考ください。
全体像
このサンプルは、以下の2つの主要なパートで構成されています:
※ 入力値をinputTextとして送信し、valueが「hoge」であるかを判定するシンプルな検証をしています。
・ フロントエンド(HTML/JavaScript/CSS)(PHP) ユーザの入力値を取得し、非同期通信を通じて検証用カスタムAPIに送信します。
※ 検証結果に応じ、入力エラーの場合は登録ボタンを無効化するなど、ユーザに分かりやすいフィードバックを提供します。
注意点
・ APIのエンドポイントURLも、実際の環境に合わせて正しく設定しましょう。
・ エラーハンドリングや通信エラー時の処理を充実させることで、ユーザにとって分かりやすいフィードバックを提供できます。
DB連携の可能性
本サンプルでは固定値との照合を行っていますが、実際の運用ではデータベースに保存された値との突合や、複数条件での検証も可能です。
ユーザ情報や検証結果の履歴をデータベースに保存することで、後日の分析や不正アクセスの監視など、より高度なシステム運用が実現します。
カスタムAPI設定
サイトの管理画面などでカスタムAPIの設定を行い、以下のPHPコードを利用することで、入力値の検証用APIを構築できます。
必要に応じて、認証処理やDB連携などの機能を追加して、セキュアかつ柔軟なシステムに仕上げてください。
カスタムAPIコード例
【PHP】<?php // カスタムAPI用のPHPコード例 // リクエスト本文(JSON)を連想配列として取得 $requestBody = $SPIRAL->getCustomApiRequestBody(); // 入力値は「inputText」というキーで送信される前提です if (!isset($requestBody['inputText'])) { $SPIRAL->setCustomApiResponse([ 'status' => 'failed', 'errorMessage' => 'inputTextパラメータが存在しないか形式が不正です' ]); return; } $inputText = $requestBody['inputText']; // 検証対象の値(例として "hoge" を使用) $checkValue = "hoge"; // ここでは、入力値と定義値の一致を検証します。 // 実際には、データベース照合や外部APIとの連携も可能です。 if ($inputText === $checkValue) { $SPIRAL->setCustomApiResponse([ 'status' => 'success', 'inputText' => $inputText ]); } else { $SPIRAL->setCustomApiResponse([ 'status' => 'failed', 'errorMessage' => '照合エラー' ]); } ?>
// 検証対象の値(例として "hoge" を使用) $checkValue = "hoge";
検証用フロントエンドコード例
下記のコードは、ユーザの入力値を取得し、カスタムAPIに送信して検証結果をUIに反映する仕組みを示しています。
【フロント:Javascript】
document.addEventListener("DOMContentLoaded", function () { const checkFieldName = "text"; // チェック対象のinput要素のname属性 const API_URL = 'https://example.com/api/validate'; // カスタムAPIのURLに変更してください // 入力フィールド、送信ボタン、結果表示領域の取得 const inputField = document.querySelector("[name='" + checkFieldName + "']"); const submitButton = document.querySelector(".sp-form-next-button"); const resultMessage = document.getElementById("result"); if (!inputField) { console.error("要素 [name='" + checkFieldName + "'] が見つかりません"); return; } // 初期状態では登録ボタンを無効化(※ フォームがない場合は、この処理は任意で利用してください) if (submitButton) { submitButton.disabled = true; } /** * APIを呼び出して検証を実施する処理 * @param {string} value - 検証対象の値 * @returns {Promise<object>} - APIから返されたレスポンスのJSON */ async function performValidation(value) { try { const response = await fetch(API_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ inputText: value }) }); return await response.json(); } catch (error) { // 通信エラーの場合はエラーオブジェクトをthrow throw new Error("通信エラー"); } } /** * UIの更新を担当する処理 * @param {Object} options * @param {string} options.message - 表示するメッセージ * @param {string} options.color - メッセージの色 * @param {boolean} options.isValid - 登録ボタンの有効状態(true:有効、false:無効) */ function updateUI({ message, color, isValid }) { resultMessage.textContent = message; resultMessage.style.color = color; if (submitButton) { submitButton.disabled = !isValid; } } /** * 全体の検証処理(入力チェック → API呼び出し → UI更新)を実施する関数 */ window.validate = async function () { const checkValue = inputField.value; if (!checkValue) { updateUI({ message: "値を入力してください", color: "red", isValid: false }); return; } try { const data = await performValidation(checkValue); if (data.status === "success" && data.data && data.data.status === "success") { updateUI({ message: "success", color: "green", isValid: true }); } else { const errorMsg = (data.data && data.data.errorMessage) || data.errorMessage || "不明なエラー"; updateUI({ message: "エラー: " + errorMsg, color: "red", isValid: false }); } } catch (error) { updateUI({ message: error.message, color: "red", isValid: false }); } }; });
const checkFieldName = "text"; // チェック対象のinput要素のname属性 const API_URL = 'https://example.com/api/validate'; // カスタムAPIのURLに変更してください
<input type="text" name="text"> <p id="result"></p> <button type="button" onclick="validate()">検証</button>
/* 必要に応じてスタイルを追加してください */ #result { font-size: 1.2em; margin-top: 10px; } .sp-form-next-button:disabled { opacity: 0.5; cursor: not-allowed; }
最後に
実運用では、セキュリティ対策やエラーハンドリング、データベース連携などの機能を追加することで、より堅牢なシステムへと発展させることが可能です。
本記事が、カスタムAPIや非同期通信の理解に役立つことを願っています。
不具合やご質問がある場合は、下記の「コンテンツに関しての要望はこちら」からご連絡ください。