開発情報・ナレッジ

投稿者: SPIRERS ナレッジ向上チーム 2023年6月5日 (月)

主キーのメールアドレスをフォームで重複登録できるようにしたい

この記事では主キーのメールアドレスフィールド(入力必須、ユニーク)を用意しつつ、フォームでは重複を許可して登録させる方法をご紹介します。

設定イメージ

登録フォームにはユニーク制約が設定されていない別のメールアドレスフィールドを入力項目として用意します。
ただし、主キーのメールアドレスフィールドに何かしらの値を登録しないと入力必須エラーが発生するため、JavaScriptによって生成されたランダムなメールアドレスを一時的なメールアドレスとして裏側で登録します。
フォームから登録されると、DBトリガのレコードアクションによりフォームで入力されたメールアドレスが主キーのメールアドレスにマッピングされます。
しかし、メールアドレスが既に存在している場合は重複エラーとなりマッピングが失敗します。
マッピングが失敗した場合は、メールアドレス重複フラグを立てます。
メールアドレス重複フラグの有無を条件とすることで、重複した場合にユーザーや事務局にメールを送信したり、カスタムプログラムによって重複したデータを削除したりすることが可能となります。

DBフィールド設定

設定に必要なフィールドのみを記載しています。
表示名(任意) フィールドタイプ DB上で必須な属性
メールアドレス(主キー)
※追加済みの場合は不要
メールアドレス 必須制約:あり
ユニーク成約:あり
メールアドレス(フォーム用) メールアドレス なし
メールアドレス重複フラグ セレクト 1:重複

DBトリガ設定

レコードアクション① メールアドレスマッピング
フォームで入力されたメールアドレスを主キーのフィールドにマッピングするための設定です。
重複するメールアドレスの場合はマッピングが成功せず、②のアクションでメールアドレス重複フラグが立てられます。
レコードアクション設定
トリガ種別 登録トリガ
アクション先 自DB
アクション先への操作 更新
処理設定
発動条件 指定する
経路条件:一部の経路 > フォーム
処理タイプ 更新
処理マッピング アクション先DBフィールド:メールアドレス(主キー) = 格納値:メールアドレス(フォーム用)
エラー処理 フォーマットチェック:エラー終了
入力必須チェック:エラー終了
重複不可チェック:アクション先DBに更新せずに、次のアクションへ
レコードアクション② メールアドレス重複フラグ立て
「メールアドレス(主キー)」と「メールアドレス(フォーム用)」が一致してない場合(マッピングが成功していない場合)にメールアドレス重複フラグを立てるトリガ設定です。
レコードアクション設定
トリガ種別 登録トリガ
アクション先 自DB
アクション先への操作 更新
処理設定
発動条件 指定する
経路条件:一部の経路 > フォーム
関数条件:
@newDB2.email <> @newDB2.email_temp
処理タイプ 更新
処理マッピング アクション先DBフィールド:メールアドレス重複フラグ = 格納値:
'1'

エラー処理 フォーマットチェック:エラー終了
入力必須チェック:エラー終了
重複不可チェック:エラー終了

登録フォーム設定

メールアドレス(フォーム用)の入力項目を追加する
既存のフォームに設定を行う場合は、「メールアドレス(フォーム用)」の入力項目を追加します。
メールアドレス(主キー)のhiddenタグを追加する
JavaScriptで生成したランダムなメールアドレスを「メールアドレス(主キー)」フィールドに登録するためのタグを追加します。
既存のフォームを修正する場合は、入力と完了の両方のステップからメールアドレス(主キー)の項目を削除したのちに、下記のソースを入力ステップに追加してください。
html
<!--/* メールアドレス(主キー)(email) */-->
<sp:input-field name="f0X"></sp:input-field>
<input id="email-input" type="hidden" th:name="${fields['f0X'].name}" value="">
ランダムなメールアドレスを生成するコードを追加します。
JavaScript
window.onload = function() {
  const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  let email = '';
  for (let i = 0; i < 16; i++) {
    email += characters.charAt(Math.floor(Math.random() * characters.length));
  }
  email += '@example.com';
  const emailInput = document.getElementById('email-input'); 
  emailInput.value = email;
}

テスト登録&チェック

設定完了後はテスト登録を行い、メールアドレスが正しくマッピングされているか、重複している場合に正しくメールアドレス重複フラグが立っているか などをご確認ください。

メールアドレス重複フラグが立ったデータに対する設定例

ユーザーまたは事務局宛てに重複お知らせメールを送信する
配信条件を[メールアドレス重複フラグ][等しい][重複]としたメールアクションを作成することで、メールアドレスが重複した場合のみメールを配信することが可能です。
フォーム送信後にメールを配信する設定方法については、サポートサイト フォームのメールアクション をご覧ください。
一定期間経過した重複データを削除する
カスタムプログラムを使用することで、一定期間超過した重複データを削除することが可能です。
カスタムプログラムの機能説明は、サポートサイト スケジュールトリガのカスタムプログラムアクション をご覧ください。
レコードを一括削除するプログラムについては、カスタムプログラムの使いどころAPIメソッドごとのサンプルコードまとめ Record (batch) の「レコード一括削除依頼作成メソッド」を参考にしてください。
解決しない場合はこちら コンテンツに関しての
要望はこちら