Codeigniter3のバリデーション

Codeigniter3でバリデーションを書くときの覚え書き。

postされた値をバリデーションする場合

codeigniterでは手動でデータを設定しない場合、自動的にpostデータをバリデーションする。

  $this->load->library('form_validation');
  $config = [
    [
      'field' => 'name',
      'label' => '名前',
      'rules' => [
        'trim',
        'required',
      ],
    ],
  ];
  $this->form_validation->set_rules($config);
  if ($this->form_validation->run() === TRUE) {
    // OK
  } else {
    // NG
  }

postされた値以外をバリデーションする場合

postされた値以外をバリデーションしたい場合は、set_data()を使用する。

  $data = [
    'name' => 'yamada',
  ];
  $this->form_validation->set_data($data);

ライブラリの初期化時にルールを設定する場合

引数にバリデーションルールを指定する。

  $this->load->library('form_validation', [
    [
      'field' => 'name',
      'label' => '名前',
      'rules' => [
        'trim',
        'required',
      ],
    ],
  ]);

エラーメッセージの前後のタグを変更する場合

prefixとsuffixを指定する。デフォルトはpタグ。

  $this->load->library('form_validation', [
    'error_prefix' => '<p>',
    'error_suffix' => '</p>',
  ]);

独自のバリデーションを行う場合

例)無名関数(クロージャ)を利用して名前が'yamada'かどうかをチェックする場合。

  $_name = 'yamada';
  $config = [
    [
      'field' => 'name',
      'label' => '名前',
      'rules' => [
        'trim',
        'required',
        [
          'check_name',
          function($value) use ($_name) {
            if ($value == $_name) {
              return TRUE;
            } else {
              return FALSE;
            }
          },
        ],
      ],
      'errors' => [
        'check_name' => '%s が山田ではありません。'
      ]
    ],
  ];

viewでエラーを表示する場合

全てのエラーを表示する場合

<?php echo validation_errors(); ?>

個別でエラーを表示する場合

<?php echo form_error('name'); ?>

コントローラーでエラーを取得する場合

全てのエラーを取得する場合

  $errors = $this->form_validation->error_array();

個別でエラーを取得する場合

  $errors = $this->form_validation->error('name');

エラーメッセージを日本語にする場合

application/config/config.phpでlanguageをjapaneseに変更する。

  $config['language'] = 'japanese';

system/language/englishフォルダ内のform_validation_lang.phpをコピーし、application/languageフォルダにjapaneseフォルダを作成しペーストする。

エラーメッセージを適当な文字に変更する。

  $lang['form_validation_required'] = '{field} を入力してください。';