2010年12月26日日曜日

CodeIgniterでGoogleContactsAPIのテスト(7)

さていろいろとハマりまくっているCodeIgniterですがバリデーションにも一癖二癖ある感じです。既に使われている方々にはあたりまえの事かもしれませんがこれから始めて触ってみようという方のために記事にしておきたいと思います。

まずはバリデーションを通らなかったときの対応について。

一般的にはform画面に戻って入力結果をinput等に戻して表示という流れになるかと思います。今回複数のメールアドレスや電話番号登録が可能なように実装しているのでformのnameを配列としてCIに渡しております。

このように配列を利用するとバリデーションに渡した結果を受けるときのset_valueメソッドが上手く動作していないようで値を得ることが出来ませんでした。

仕方がないのでMy_Form_validation.phpを作成してForm_vaidationクラスを継承した独自バリデーションクラスを作成してちょこっとset_validationをいじりました。

function set_value($field = '', $default = '') {
 if ( ! isset($this->_field_data[$field]))
 {
  return $default;
 }

 if ( ! isset($this->_field_data[$field]['postdata'])) {
  return $default;
 } else {
  return $this->_field_data[$field]['postdata'];
 }
}

バリデーション後にviewを呼びだす前に$_POSTに必要データを突っ込んでおいて

set_value('edit', $this->input->post('edit'));

のような感じでデフォルト値として$_POSTからのデータを入れておいてあげると上手く行きました。

また複数formのバリデーションを行なう場合にユーザガイドでは http://codeigniter.jp/user_guide_ja/libraries/form_validation.html#savingtoconfig の「検証ルールのセットを作る」に従ってセット名を付けて呼びだすようになっています。

例えば…

if ($this->form_validation->run('contacts') == TRUE) {
 $this->gdata_model->post();
 $data = $this->gdata_model->getContactsList();
 $this->load->view('contacts_index', $data);
} else {
 $this->load->view('form_contacts_view', $this->gdata_model->getFormData());
}

こんな感じで呼びだすことになる訳です。

このときに利用するルールをApplication/config/form_validation.phpに配列として記載する訳ですがユーザドキュメントでは2010/12/25現在「=>」とすべきところが「=」となってしまっています。
こんな間違いに30分もハマるのは私くらいのものかと思いますが念のため書いておきます。(笑

軽快なCodeIgniterなだけあって痒いところに手が届くという機能は実装されてない感じもありますが個人的にはわりと気に入ったのでもうちょっと深く勉強してみたいと思っています。

0 件のコメント:

コメントを投稿