2016年9月11日日曜日

知らねばほっとけとはいかない Codeigniter3 独自 バリデーション チェック に 引数 を渡す

オフィス狛 技術部です。

第1回(小石につまずくとけっこう痛い Codeigniter3 ファイル命名規約)、
第2回(小石につまずくとけっこう痛い Codeigniter3 複数ファイル同時アップロード)、
第3回(小石につまずくとけっこう痛い Codeigniter3 csrf_token の 有効期限切れ エラー をキャッチ)に引き続き、

今回も PHP ( Codeigniter3 )で地味につまずいたことと書こうと思っております。
今回は、
『 独自のバリデーションチェック に引数を渡す 』
です。

独自バリデーションチェックの作成方法は本家サイトにお任せします。
Form Validation — CodeIgniter 3.1.0 documentation callbacks-your-own-validation-methods

ちなみに
 $this->form_validation->set_rules() に設定する際に
メソッドの先頭に「 callback_ 」を付けなければいけないというルールを知らずに
ちょっとつまってしまった経験があるので、一応記載しておきます。
チェックメソッドが
username_check()
ならば、
$this->form_validation->set_rules('username', 'Username', 'callback_username_check');
と書く必要があるということですね。

では、このチェックメソッドにどうやって引数を渡すのか?

調べた結果、2つ方法があるようです。
1.  $this->input->post() で取得する
$this->form_validation->set_rules('uri', 'URI', 'callback_check_uri');
function check_uri(){
 $this->input->post('url');
 $this->input->post('id');
}

2. $this->form_validation->set_rules()の中に書く
$this->form_validation->set_rules('uri', 'URI', 'callback_check_uri['.$this->input->post('id').']');
function check_uri($field, $id){
 // $fieldにはバリデーション対象のPOSTデータが自動で入ります。
}
※CI2.1以上であることが条件だそうです。

個人的には
文字列結合して引数を渡しているのが
どうしても無理やりな感じがしているので
1の方がいいなと思うのですが
公式ドキュメントでは2の方法が書かれています。

1の場合ですと、引数が増えても楽に対応出来そうですよね。

ちなみに2のような形式で行う場合は、

$this->form_validation->set_rules('uri','URI','callback_check_uri[id,method]');
function check_picture($image,$param){
 $param = preg_split('/,/', $param);
 $id = $param[0];
 $method = $param[1];
}
と書けば上手くいくようです。
※公式ではないようですが。。。

チェック自体は単純にPOSTデータを取得してチェックが可能ですが、
その後のエラーメッセージの表示などを考えると他のバリデーションチェックと
同じようにできるのは便利ですし、可読性・保守性が向上するのではないかと思います。

知らねばほっとけではいけませんね。

,

2016年9月2日金曜日

小石につまずくとけっこう痛い Codeigniter3 csrf_token の 有効期限切れ エラー をキャッチ

オフィス狛 技術部です。

前々回(小石につまずくとけっこう痛い Codeigniter3 ファイル命名規約)、
前回(小石につまずくとけっこう痛い Codeigniter3 複数ファイル同時アップロード)に引き続き、

今回も PHP ( Codeigniter3 )で地味につまずいたことと書こうと思っております。

何度も言いますが
 Codeigniter は日本語の情報が少ない!!!
ということでよくつまずきます。

なので、自分の調べた備忘録も兼ねて、
ここにつまずきろく(記録)をためていきたいと思います。

今回のつまずきは、
『 csrf_token の有効期限切れ エラーをキャッチする 』
でした。

デフォルトの設定ですと「 error_general.html 」が表示されるようになっていますが、
弊社では、「操作に失敗しました。」といったようなその名の通り全般的なエラーの内容を表示するようにしています。

画面を放置していて動かしてみたらいきなり「操作に失敗しました。」と出るのは違和感があるので、そのままページを再読み込するようにしてほしいとの要望がありました。

どうやるのかパッと思いつかず、つまずき発生。
で、色々調べてみた結果、

「 CI_Security 」を継承して「 csrf_show_error() 」メソッドをオーバーライドすればよかったようです。

class MY_Security extends CI_Security {
    public function __construct()
    {
        parent::__construct();
    }
    public function csrf_show_error()
    {
        // エラー画面を表示したり
        // show_error('The action you have requested is not allowed.');

        // ページをリフレッシュしたり
        // header('Location: ' . htmlspecialchars($_SERVER['REQUEST_URI']));
    }
} 
参考にしたサイト:
http://stackoverflow.com/questions/14406922/prevent-from-displaying-the-default-csrf-error-page-in-codeigniter

そういえば、独自のエラーハンドリングを行う際も、
「 CI_Exceptions 」を継承してエラーメソッドをオーバーライドするのと同じだなと後々気が付きました。

パッと出てこないということはまだまだ習熟が足りてない証拠です。
改めてドキュメントを見返してみるなど勉強が必要だなと思う今日この頃でした。

足元の確認は大事ですね。

,