本文へスキップ

フォームに独自のバリデーターを追加する

ceFormValidator の registerValidator で独自の検証ルールを追加し、エラーメッセージを翻訳して表示する方法。JAN コードや半角カナの検証例つき。

更新日: Markdown で表示

管理画面のフォームに、独自のバリデーションルールを追加する方法です。たとえば JAN コードの検証、半角カナだけを許可する検証、業務ロジックのチェックなどに使えます。CS-Cart 4.19.1 で確認した内容です。

ファイルの構成

js/addons/<アドオン名>/func.js                                            # バリデーターのロジック
design/backend/templates/addons/<アドオン名>/hooks/index/scripts.post.tpl # JS の読み込みと翻訳の登録
var/langs/ja/addons/<アドオン名>.po                                       # エラーメッセージの翻訳

1. JavaScript でバリデーターを登録する

ce.commoninit イベントの中で登録します。

// js/addons/my_addon/func.js
(function (_, $) {
    'use strict';

    $.ceEvent('on', 'ce.commoninit', function (context) {

        $.ceFormValidator('registerValidator', {
            class_name: 'cm-custom-validator',        // label に付けるクラス名
            message: _.tr('my_addon.validation_error'), // エラーメッセージ(翻訳キー)
            func: function (id) {
                var val = $('#' + id).val();
                if (!val) return true; // 空の場合は検証しない(cm-required と組み合わせられる)
                // 検証のロジック
                return true; // OK: true、NG: false
            }
        });

    });

})(Tygh, Tygh.$);

2. テンプレートで JS を読み込み、翻訳キーを登録する

{* design/backend/templates/addons/my_addon/hooks/index/scripts.post.tpl *}
<script>
    (function(_, $) {
        _.tr({
            "my_addon.validation_error":
                "{__("my_addon.validation_error")|escape:"javascript"}"
        });
    }(Tygh, Tygh.$));
</script>

{script src="js/addons/my_addon/func.js"}

3. フォームにバリデーターを指定する

<div class="control-group">
    {* label には cm-required(必須)と cm-custom-validator(独自)を両方指定できる *}
    <label class="control-label cm-required cm-custom-validator" for="elm_field_id">
        {__("field_name")}:
    </label>
    <div class="controls">
        <input type="text" name="data[field]" id="elm_field_id" value="" />
    </div>
</div>

4. 翻訳ファイル

# var/langs/ja/addons/my_addon.po
msgctxt "Languages::my_addon.validation_error"
msgid "Custom validation error message"
msgstr "独自のバリデーションのエラーメッセージ"

実装例

JAN コードの検証

13桁の JAN コードを、チェックディジットも含めて検証します。

$.ceFormValidator('registerValidator', {
    class_name: 'cm-jan-code',
    message: _.tr('my_addon.validation_jan_invalid'),
    func: function (id) {
        var code = $('#' + id).val();
        if (!code) return true;

        // 13桁の数字であること
        if (!/^\d{13}$/.test(code)) return false;

        // チェックディジットの検証
        var oddSum = 0, evenSum = 0;
        for (var i = 0; i < 12; i++) {
            var digit = parseInt(code.charAt(i), 10);
            if (i % 2 === 0) oddSum += digit;
            else evenSum += digit;
        }
        var total = oddSum + evenSum * 3;
        var expectedCD = (10 - (total % 10)) % 10;
        return parseInt(code.charAt(12), 10) === expectedCD;
    }
});

半角カナの検証

ASCII の文字と半角カナだけを許可し、全角の文字を拒否する例です。

// ASCII と半角カナだけを許可する
function isAsciiOrHalfWidthKatakana(str) {
    for (var i = 0; i < str.length; i++) {
        var c = str.charCodeAt(i);
        // ASCII: 0x00-0x7F、半角カナ: 0xFF61-0xFF9F
        var isValid = (c >= 0x00 && c <= 0x7F) ||
                      (c >= 0xFF61 && c <= 0xFF9F);
        if (!isValid) return false;
    }
    return true;
}

$.ceFormValidator('registerValidator', {
    class_name: 'cm-check-kana',
    message: _.tr('my_addon.validation_kana_only'),
    func: function (id) {
        var val = $('#' + id).val();
        if (!val) return true;
        return isAsciiOrHalfWidthKatakana(val);
    }
});

複数のフィールドを比較する

内箱の入数が外箱の入数より小さいことを確認する例です。

$.ceFormValidator('registerValidator', {
    class_name: 'cm-check-product-pieces',
    message: _.tr('my_addon.validation_innercase_outercase'),
    func: function (id) {
        var innercase = parseInt($('#elm_piece_innercase').val(), 10) || 0;
        var outercase = parseInt($('#elm_piece_outercase').val(), 10) || 0;
        if (innercase === 0 || outercase === 0) return true;
        return innercase < outercase;
    }
});

標準のバリデーションクラス

cm-required、cm-email、cm-phone、cm-zipcode、cm-integer、cm-value-decimal などがあります。一覧は マイクロフォーマット を参照してください。

注意点

JavaScript から翻訳を使う方法(_.tr() への登録と |escape:"javascript")の詳しい注意点は、フォームの送信イベントとバリデーション にまとめています。

関連ページ

ナビゲーション

検索語を入力してください…

↑↓ 移動↵ 開くEsc 閉じる