CodeIgniter 3.xのForm validationで知っておいたほうがいいかも知れないこと

1. CallbackはControllerでしか定義できない

検証ルールをメソッドに定義するCallbackと呼ばれる方法は、Controllerでしか使えません。つまり、Modelに検証メソッドを定義する場合には使えません。

2. Callableにパラメータを渡す方法は用意されていない

Callbackではパラメータをcallback_foo[bar]のように渡すことができます。

If you need to receive an extra parameter in your callback method, just add it normally after the method name between square brackets, as in: callback_foo[bar], then it will be passed as the second argument of your callback method.
https://www.codeigniter.com/userguide3/libraries/form_validation.html#callbacks-your-own-validation-methods

しかし、Callableではパラメータを渡す方法は用意されていません。

パラメータを渡したい場合は、クロージャを使うことを検討してください。

3. Callback/Callableは最優先で検証される

検証ルールは定義した順番で実行されると思うかも知れませんが、実は違います。Callback/Callableが最優先で実行され、その後、requiredが検証されます。

"Callbacks" are given the highest priority (always called), followed by 'required' (called if callbacks didn't fail), and then every next rule depends on the previous one passing.
https://github.com/bcit-ci/CodeIgniter/blob/develop/system/libraries/Form_validation.php#L505

4. set_data()は検証ルールを定義する前に実行する必要がある

$_POST以外のデータを検証する際に使うset_data()は、set_rules()を呼び出す前に実行しなければなりません。

You have to call the set_data() method before defining any validation rules.
https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post

まとめ

  1. CallbackはControllerでしか定義できない
  2. Callableにパラメータを渡す方法は用意されていない
  3. Callback/Callableは最優先で検証される
  4. set_data()は検証ルールを定義する前に実行する必要がある

参考

Tags: codeigniter

JavaScriptのDateオブジェクトとタイムゾーン

コンストラクタでの日付文字列の扱い

以下、Mac OSのブラウザで検証。

Firefox

JST
d = new Date('2017/09/01')

Date 2017-08-31T15:00:00.000Z

d = new Date('2017-09-01')

Date 2017-09-01T00:00:00.000Z

PDT
d = new Date('2017/09/01')

Date 2017-09-01T07:00:00.000Z

d = new Date('2017-09-01')

Date 2017-09-01T00:00:00.000Z

Chrome

JST

d = new Date('2017/09/01')

Fri Sep 01 2017 00:00:00 GMT+0900 (JST)

d = new Date('2017-09-01')

Fri Sep 01 2017 09:00:00 GMT+0900 (JST)

PDT

d = new Date('2017/09/01')

Fri Sep 01 2017 00:00:00 GMT-0700 (PDT)

d = new Date('2017-09-01')

Thu Aug 31 2017 17:00:00 GMT-0700 (PDT)

Safari

JST

> d = new Date('2017/09/01')

< Fri Sep 01 2017 00:00:00 GMT+0900 (JST)

> d = new Date('2017-09-01')

< Fri Sep 01 2017 09:00:00 GMT+0900 (JST)

PDT

> d = new Date('2017/09/01')

< Fri Sep 01 2017 00:00:00 GMT-0700 (PDT)

> d = new Date('2017-09-01')

< Thu Aug 31 2017 17:00:00 GMT-0700 (PDT)

まとめ

Firefox、Chrome、Safariとも

  • new Date('YYYY/MM/DD') だとローカルタイム
  • new Date('YYYY-MM-DD') だとUTC

と解釈される。

参考

Tags: javascript