【eccube2】バリデーションの追加

eccube2にてバリデーションを増やしたい場合の追加方法をご紹介します。
追加するにあたってお題に沿って追加しようと思います。

お題
---
「会員登録」の時にパスワードを忘れたときのヒントとして半角英数字のみ入力できる質問を用意する


ソースの修正
----
1.mtb_reminderにid:8を追加
パスワードを忘れたときのヒントとして、秘密の呪文という質問の選択肢を追加します。

![スクリーンショット 2023-11-20 5.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991768/c172e9cd-0e2b-3d82-e3ff-edfc84773ed0.png)

こんな感じでパスワードを忘れた時のヒントを追加しました。
※ちなみに追加直後に反映されない場合はキャッシュが残ってる可能性があるので、チェックしてみてください。

2.バリデーションの追加
修正ファイル

checkErrorメソッドのCASEに**REMINDER_CHECK**を追加
・data/class/SC_FormParam.php

checkErrorメソッドがあるので、$this->recursionCheckが呼ばれている前に追加をしましょう。

```
- 略 -
case 'PREF_CHECK':
case 'REMINDER_CHECK': //←追加
    $this->recursionCheck($this->disp_name[$index], $func,
        $value, $arrErr[$key], $this->length[$index]);
    if (SC_Utils_Ex::isBlank($arrErr[$key])) {
        unset($arrErr[$key]);
    }
    break;
// 小文字に変換
case 'CHANGE_LOWER':
- 略 -
```

バリデーション処理を追加
・data/class/SC_CheckError.php

```
    /**
     * パスワードを忘れたときのヒントの質問で秘密の呪文を選択した場合
     * @param $value
     * @return void
     */
    public function REMINDER_CHECK($value)
    {
        $disp = $value[0];
        $keyname = $value[1];

        $answer = $this->arrParam[$keyname];
        if (!preg_match('/[A-Za-z0-9_.]/', $answer)) {
            var_dump('OK');
            $this->arrErr[$keyname] = '※ ' . $disp . 'は半角英数字以外は入力できません。<br />';
            var_dump($this->arrErr);
        }
    }
```

先ほど、SC_FormParam.phpにCASEを追加したことによって、こちらのメソッドが呼び出せる様になりました。

・data/class/helper/SC_Helper_Customer.php

会員エラーチェック共通(sfCustomerCommonErrorCheck)に
reminderが**8**の時だけREMINDER_CHECKを呼び出す様にします。

```
    public static function sfCustomerCommonErrorCheck(&$objFormParam, $prefix = '')
    {
        $objFormParam->convParam();
        $objFormParam->toLower($prefix . 'email');
        $objFormParam->toLower($prefix . 'email02');
        $arrParams = $objFormParam->getHashArray();

        // 入力データを渡す。
        $objErr = new SC_CheckError_Ex($arrParams);
        $objErr->arrErr = $objFormParam->checkError();

        //↓追加ここから
        //パスワードを忘れたときのヒントが「秘密の呪文(半角英数字)」だった場合のみエラーチェックを実施
        if ($arrParams['reminder'] == '8') {
            $objErr->doFunc(array('パスワード確認用の質問の答え', 'reminder_answer'), array('REMINDER_CHECK'));
        }
        //↓追加ここまで

        $objErr->doFunc(array('電話番号', $prefix . 'tel01', $prefix . 'tel02', $prefix . 'tel03'), array('TEL_CHECK'));
        $objErr->doFunc(array('FAX番号', $prefix . 'fax01', $prefix . 'fax02', $prefix . 'fax03'), array('TEL_CHECK'));
        $objErr->doFunc(array('郵便番号', $prefix . 'zip01', $prefix . 'zip02'), array('ALL_EXIST_CHECK'));

        return $objErr;
    }
```

これでバリデーションチェックの追加は完了しました。
早速管理画面からちゃんとバリデーションチェックができているか確認をしてみましょう。

①半角英数を入力した場合
![スクリーンショット 2023-11-20 9.19.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991768/43be2fc3-cc1e-84e6-ed04-f90d2c04b519.png)

②半角英数以外を入力した場合
![スクリーンショット 2023-11-20 9.17.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991768/2f361a6d-ccad-ec45-2a42-4b32615ab5e2.png)

ちゃんとバリデーションチェックが効いてることが確認できました！

最後に
---

今回は、「mtb_reminderにidが８の時」という条件があったので、```$objErr->doFunc```を使用しましたが、
そうでない場合は、```$objFormParam->addParam```の$arrCheckに設定して使用することができます。

Controllerに直接書かずにSC_CheckErrorに書いた方が後々見やすくなるかと思いますので、ぜひ参考にしてみてください。