0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

kintone で条件付バリデーション

Last updated at Posted at 2022-08-25

kintone とは?

  • kintone についてはこちらに詳しく掲載されていますのでご確認下さい

条件付バリデーションとは何か?

  • 何らかの条件が成り立つ場合のみ、値が妥当かどうか検証する仕組み
  • ここで言う条件付バリデーションとは特定のフィールド内で特定の値を持つレコード間でのみ重複禁止を指す
    • 具体的には下記の従業員DBの雇用状態が 在職中休職中 のレコード間ではニックネームの重複を禁止する
      • 例: id が 1 のレコードの場合
        • ニックネームを せとぼんこつ に変更することはできない
        • ニックネームを あんずほんだ に変更することはできる(退職済のため)

従業員DB

id 雇用状態
(emp_status)

(last_name)

(first_name)
ニックネーム
(nickname)
1 在職中 武藤 遊司 ゆう
2 在職中 海原 瀬人 せと
3 休職中 城之内 和也 ぼんこつ
4 退職済 藤崎 杏子 あんず
5 退職済 本田 ヒロシ ほんだ

なぜ条件付バリデーションを行うのか?

  • 文字列(1行)のフォーム作成の際に kintone 標準ではユーザからの入力に対してかけられるバリデーションは 必須項目にする値の重複を禁止する ぐらいしかない為、例えば ひらがなのみ登録可特定の条件下でのみ重複禁止 というようなバリデーションを行うことができない。
    よって、このようなバリデーションを行いたい場合はカスタマイズしたり、プラグインを導入したりする必要がある。
    • バリデーションによっては gusuku Customine で実現することもできるが今回は自身でカスタマイズを行う。

実際のコード

(() => {
    'use strict';

    const EMPLOYED = '在職中';
    const ABSENT   = '休職中';
    const RETIRED  = '退職済';

    const EMP_INCUMBENT_STATUSES = [EMPLOYED, ABSENT];

    let recordPrev;

    kintone.events.on([
        'app.record.index.edit.show',
        'app.record.create.show',
        'mobile.app.record.create.show',
        'app.record.edit.show',
        'mobile.app.record.edit.show',
    ], (event) => {
        recordPrev = event.record;
    });

    kintone.events.on([
        'app.record.index.edit.submit',
        'app.record.create.submit',
        'mobile.app.record.create.submit',
        'app.record.edit.submit',
        'mobile.app.record.edit.submit',
    ], (event) => {
        let record = event.record;
        // 未入力の場合はチェックしない
        if (record.nickname.value === undefined) {
            return event;
        }
        // ニックネームに変更がない場合(ニックネーム以外の項目を変更した場合など)はチェックしない
        if (recordPrev.nickname.value === record.nickname.value) {
            return event;
        }
        // 退職済の場合は重複してもいいのでチェックしない
        if (record.emp_status.value === RETIRED) {
            return event;
        }
        let params = {
            'app': kintone.app.getId(),
            'query': 'nickname = "' + record.nickname.value + '" and emp_status in ("' + EMP_INCUMBENT_STATUSES.join('","') + '")',
            'fields': ['last_name', 'first_name']
        };
        return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then((response) => {
            if (response.records.length > 0) {
                record.nickname.error = "下記の方と重複しています。\n\n";
                record.nickname.error += response.records.map(r => r.last_name.value + ' ' + r.first_name.value).join("\n");
            }
            return event;
        }, (response) => {
            record.nickname.error = '取得できませんでした';
            console.log(response);
            return event;
        });
    });
})();
  • エラーメッセージの見せ方は好みにあわせてカスタマイズして下さい。
  • 不具合や同じことをするのであればこう書いたほうが良いというものがあればコメント欄にてお知らせ下さい。
    • 個人的には recordPrev (変更前の状態)が show 系イベント内ではなく、 submit 系イベント内で取得できたら良いのになと思ってます。😅

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?