スポンサー広告 :
無料ホームページ作成mp7

Main menu:

2012年 1月
« 3月    
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

サイト検索

カテゴリ

PR

QRコード

AX

アーカイブ

移動

このブログの内容は http://choco-moca.pugpug.org/wp に移動しました。

ちいたんとCIのバリデーションの違い

ちいたんはチェックする変数を入力する(事前処理等の修正が可能)
CIは入力変数自体をチェックする(事前処理等の修正ができない)

これは良いとしても、

requiredの場合、ちいたんは変数が定義されていればルールを適用する。
requiredの場合、CIは変数が定義されていなくてもルールを適用する。

requiredの場合、変数を要求しているのではなく、変数に値が入っていることを要求するのである。変数自体が無いのはシステムの都合であり、検証の対象ではない。C,R,U,Dのシステムにより入力変数は変わるので、CRUDにまたがったルールを書けるちいたんのほうが使いやすい。

CIたんの設計メモ

  • Controllerクラスを継承。
  • ちいたんは入力フォーム変数は$c->dataにはいり、一方出力変数は$c->setメソッドにより$c->variablesに入る。そのため、入力値を表示値に持ってくるには変数の再結合を行わなければならなかった。
    一方一般的なCRUDを考えフローチャートを書いてみると、変数はモデルと入出力の2本で良いことが分かった。従ってCIたんでは入出力変数を$this->dataの1本とする。
  • C/R/U/D 入力待ち 実行時(エラー) 実行時(正常)
    C 空白 ⇒ $data ($data ⇒ $data) $data ⇒ model
    R model ⇒ $data
    U model ⇒ $data ($data ⇒ $data) $data ⇒ model
    D model ⇒ $data model ⇒ $data (delete)

    ちなみにちいたんの場合は、

    C/R/U/D 入力待ち 実行時(エラー) 実行時(正常)
    C 空白 ⇒ $c->vars $c->data ⇒ $c->vars $c->data ⇒ model
    R model ⇒ $c->vars
    U model ⇒ $c->vars $c->data ⇒ $c->vars $c->data ⇒ model
    D model ⇒ $c->vars model ⇒ $c->vars (delete)

    このように、C/Uの時、実行時にエラーがある場合に変数の再結合を行うが、CIたんでは必要ない。

CIたん(仮称)プロジェクト

ちいたんで開発したオフ会くんをCIに移植中だが、前の比較のように、ちいたんの良いところとCIの良いところがあり、それらの融合を検討中。たまたま、ちいたんで開発したアプリをCIに載せているため、ちいたんの自動処理で便利なところはCIに付加すればいいとこどりとなる。これをCIたん(仮称)と呼ぶ。

CIたんはCIのような(というよりそのままだが)コントローラクラスの継承となるため、コンストラクタに初期化を書くことができ、メソッドを呼ぶことで機能や画面を切り替える。当然CIの豊富なクラスやヘルパが利用可能。さらにちいたんのような、フォーム変数自動取り込み、モデルやビューの自動ロード、モデルとバリデーションの連携等が暗黙的に得られるため、コード量が減る効果がある。

なるべくCIを変更しないように考えていたが、やはりControllerクラスを継承しなければできそうもないため、Controllerクラスの継承で考える。

Templateparserコンポーネントforちいたん

完成し、問題なく動作したが、いろいろと気に入らない点がある。

1. ちいたんの元の動作が、CIのようにoutputメソッドとなってなく、最後にrequire_onceしているため、それを変更しようとするとファイルに落としてrequire_onceするしかない?とりあえずcacheディレクトリを作り、そこにパースしたファイルを置くようにした。

2. 擬似変数をどこで登録するか?ちいたんにはCIにあるようなコントローラクラスの初期化が無いため、共通のphpとしてはconfig.phpかcheetan.phpしかない。configは本来configであって、アプリの一部では無い気がする。それともinit.phpと名前を変えればよいのか。config.phpにはいろいろなコールバックが書けるようなので、config_controller()内に書けばいいのかも。

3. その書き方だが、本来はセット関数でセットすべきかもしれないが、とりあえずコントローラ内の擬似変数アレイを仮定し($controller->pv)、そのアレイに基づいて擬似変数のリプレースを行うものと、とりあえずしている。

4. CViewの継承をコンポーネント定義のファイル中で行っている。configが汚くなるため。これでも動作するが、ファイル位置が問題。view/templateファイルの位置がcomponent起点となる。これはあまりうまくないため、compnent起点+”/../”でひとつ上げているが、汚い。

Templateparserコンポーネントforちいたんの設計

smartyを使うまでもなく、シンプルな擬似変数を使いたい場合にCIにある、templateparserクラスのようなコンポーネントが欲しい。ということで、実装仕様を記述する。ちなみにCIのtemplateparserクラスは$this->load->view(ビューファイル)の代わりに$this->parser->parse(ビューファイル, データ)と行えば良い。

まず、ちいたんでsmartyを使う場合をじっくりと観察。
1. コントローラの継承
 コントローラクラスを継承し、setメソッドをオーバライド
 これは擬似変数をセットするのに必要。ちなみにCIであれば、コントローラの変数に入れてしまうところ。

2. ビューの継承
 ビュークラスを継承し、displayメソッドをオーバライド
 これは実際にTemplateparserを使用するために必要。

3. configでの読み込み
 CIならコントローラのコンストラクタに置くのだろうが、それができないためにconfigで初期設定。コントローラのコンストラクタにコールバックでも置いたらどうだろうか。

4. 使用する。
 html中に{変数}とかけば、< ?php print $変数; ?>相当の動作を行う。
 継承とはいえここまで変更すると、単なるコンポーネントと言えるかどうか。まあ便利に使えればいいかな。

CIとちいたんの比較

同一のアプリをCIとちいたんで実装しているが、そこで気づいた点を中心に両者に違いをリストする。

CI ちいたん
画面処理単位 コントローラを継承したクラスのメソッド単位、htmlからはメソッド名で呼び出し 別phpのaction関数単位、htmlからはphpファイル名で呼び出し
前画面からのデータ入力(php) △ $_POST[’変数’]、$this->input->post(’変数’); $c->data[’モデル’][’変数’]
◯ dbに入力し易い
自画面へのデータ出力(php) ◯ $data[’変数’]アレイに格納し、
$this->load->view(’ビュー名’, $data);
△ $c->set(’変数’, 値)関数または$c->variables[’変数’]アレイ
自画面でのデータ入力(html) $変数 $data[’変数’]アレイまたは$変数
処理単位を跨る変数 △ コントローラメンバ変数(初期値のみ)、◯ セッション変数 × 無し⇒◯ セッション変数拡張を開発
共通処理、初期化 ◯ コンストラクタメソッド中 × 無し、△ configに書く?
ビューファイル指定 × $this->load->viewで指定 ◯ phpと同名のhtmlがロードされるので不要、指定も可能
html中の擬似変数 ◯ テンプレートパーサクラスにより{変数}と書ける △ smarty組み込み可能
⇒◯ 開発
session変数の使い方 参照:$this->session->userdata[’変数’]
セット:$this->session->set_userdata(’変数’, 値);
参照:$c->session[’変数’]
セット:$c->session[’変数’] = 値;
モデル △ 明示的にロードする必要がある ◯ 自動ロードされる
バリデーション × コントローラ中で入力毎にルールを書いて行かなくてはならない ◯ モデル内にルールが書ける
ライブラリ、ヘルパー、コンポーネント 多い、重たい 少ない、軽い

*セッション変数はちいたんセッション変数拡張により可能

このように見ると、ちいたんは軽い割には、明示的に書かなくてもモデルやビューが自動的にロードされ、入力変数のサポートも良い。ただ、CIに慣れているだけかもしれないが、自画面へのデータ出力がわかりにくいのと、共通処理、初期化がわかりにくい点が残念。軽くて良いちいたんのベースにCIの使いやすさを取り入れたらという気がする。例えば、コントローラクラスをユーザが継承するCIのやり方を取り入れ、他は現状のままとするとか。

練習

石川遼プロが目をつぶって打ったというのを思い出し、目をつぶってドライバーを打った。ダフリはあるものの、目を開いているよりも芯に当たる気がする。手で当てに行かないだけ、軌道が一定となるようだ。右手で押すよりも左手の引きのほうがパワーが効率良く伝わる。インテンショナルドローとフェードを練習。インテンションナルフェードは簡単で、面をフラットに構え、そのまま手首を返さずまっすぐ押していくと高いフェードが打てる。一方インテンショナルドローはかなり難しい。面をフックにアドレスし、右足を若干引き、インサイドアウト軌道でスイングし、手首を若干返すようにするとドローが出る場合がある。

ちいたんによるオフ会くん

プロトタイプの完成

オフ会くんのプロトタイプが一応完成した。ただし、エラー処理等、さまざまな箇所を改善中。

仕様

前回記述のとおり。

プロジェクト登録

一応完成したので、RCSレビジョンの0.1を張り、ちいたんのプロジェクトに登録。

Kcaptchaのコンポーネント化forちいたん

CRUDシステムのSPAM対策において近年いわゆるCAPTCHAが必須となっている。phpのcaptchaライブラリを漁っていたら、kcaptchaというものが良さそうだったので、早速ちいたんに組み込んだ。オリジナルからの変更点はあまり無いが、

  • 元々がクラスを生成する際にコンストラクタを呼ぶとそのままバイナリ画像イメージを送ってきたものを変更し、generate()というメソッドとし鍵の値をリターンすることとした。これは、ちいたんのAddComponent関数でコンポーネントを登録するが、その時点で画像が生成されてしまうと困るため。
  • 鍵の値は画面間で永続性が必要であるため、セッション拡張を行ったちいたんの使用を前提に、セッション変数に格納した。
  • 画像位置の微小な修正

Kcaptchaのオリジナルソースはここ

使用例:

image.jpg
合わせてJQueryのコードを追加。これは上の画像を見て認証コードを入力するようにガイドするもの。

使用法:

html中からは、

>img src=”captcha_image.php?>?php echo session_name()?/<=>?php echo session_id()?>”<

のように画像を呼び出し、captcha_image.php中には、

function action ( &$c ) {
$c->session[’captcha_keystring’] = $c->kcaptcha->generate();
}

このようにキーをセッション変数で永続化する。さらに 認証処理するphpにおいて、

if ( $c->session[’captcha_keystring’] == $c->data[’data’][’keystring’] ) {

のように使用する。