とりあえずメモ。
日本で出た、徹底入門はぽろっぽろになった今でも、お世話になっている。
本ってとっても大事。
ということで、購入しようか悩み中。
追記:2010/01/31 15:50
結局、Amazonで買ってしまいましたw
2010/2/19 – 2010/2/24 到着予定です。
とても楽しみ(^-^)
とりあえずメモ。
日本で出た、徹底入門はぽろっぽろになった今でも、お世話になっている。
本ってとっても大事。
ということで、購入しようか悩み中。
追記:2010/01/31 15:50
結局、Amazonで買ってしまいましたw
2010/2/19 – 2010/2/24 到着予定です。
とても楽しみ(^-^)
http://code.google.com/p/modular-extensions-php5/downloads/list
2010-01-18に新しいバージョンがリリースされています。
変更履歴
http://code.google.com/p/modular-extensions-php5/updates/list
しばらくチェックできていなかったので、diffを追いかけたいと思います。
system/hepler/form_helper.php
確認画面から、フォームに戻った時にどうして、set_value()で値がなぜか取れない。
なぜ取れないのかわからない(T-T)
ということで、調べてみました。
(T-T).o(けっこう恥ずかしい理由だったわけですが、あえて公開です。)
/** * Form Value * * Grabs a value from the POST array for the specified field so you can * re-populate an input field or textarea. If Form Validation * is active it retrieves the info from the validation class * * @access public * @param string * @return mixed */ if ( ! function_exists('set_value')) { function set_value($field = '', $default = '') { if (FALSE === ($OBJ =& _get_validation_object())) { if ( ! isset($_POST[$field])) { return $default; } return form_prep($_POST[$field], $field); } return form_prep($OBJ->set_value($field, $default), $field); } }
で、form_validationのset_valueメソッドの
return $this->_field_data[$field]['postdata'];
$this->_field_data[$field][‘postdata’];がNULLだったりする・・・orz
($this->_field_data[$field]にはきちんとデータが格納されている。)
なので、set_value(“hogehoge”);で値が取れない。
form_validationのset_value
function set_value($field = '', $default = '') { if ( ! isset($this->_field_data[$field])) { return $default; } return $this->_field_data[$field]['postdata']; }
$this->_field_data[$field][‘postdata’];がnullなので、returnで値が帰ってきてもnull…..
ではどこでこの値をセットしているかをみてみると、
Form_validation.php 333行目あたり。
function run()内で処理されてる。
$this->form_validation->run();
を実行した後でなければ、set_value(“フィールド名”,”初期値”);で、POSTで送信したデータが取れないようです。
確認画面から、フォームに戻った時にどうして、set_value()で値がとれないのか謎でしたがようやく納得しました。
前回php勉強会にて、testモジュールを作りたいよということを発表しました。
http://pneskin2.nekoget.com/press/?p=371
で、MyNETS2のレポジトリを覗いてみたところ、kenjiさんが testモジュールでPHPUnitを実現していました。
すごいよkenjiさん!!!
http://usagi-project.org/redmine/repositories/diff/mynets2?rev=1295
本日(日付が変わってしまったので正しくは昨日ですね)、株式会社グリー様に会場をお借りしての、第46回PHP勉強会@関東に参加をさせていただきました。
今回はCodeIgniterのHMVC構造をテーマに発表をさせていただきました。
資料、すこし手直しをしようかなとも思ったのですが、とりあえずそのままUPです。
発表をさせていただいた様子です。
撮影いただきましたogiさん、ありがとうございます(^-^)
(^-^;).o(声が震えてて恥ずかしい・・・)
今回、発表に到るまでに、資料を見て頂き、アドバイスや情報をたくさんいただきました。
norikoさん、kenjiさん、tsujikuniさん、
そして拙い(Web翻訳頼りの)英語での質問に、とても丁寧に答えてくれた
wiredesignzさんに心から感謝です。
ありがとうございました。
勉強会でも話を聞いていただき、懇親会では声をかけていただいたりと、とても有意義な時間でした。
皆様に大大感謝です。
次回の発表の場では、もっと良いものにできるよう精進したいと思います。
第46回PHP勉強会@関東:http://events.php.gr.jp/events/show/84
http://events.php.gr.jp/events/show/84
09月30日(水) 19:30~21:30にPHP勉強会があります。
参加予定です。
今やってるCodeIgniterにmodular extensions の資料が間に合えば発表をしたいと思います。
(=_=).o(ブログ用にphp勉強会のアイコン作るかなぁ・・・)
◆ここまでのあらすじ
最初1.7.2にCIUnitを組み込んでから、HMVC modular extensions 5217.zipを組み込み後、CIUnitを組み込み。携帯対応で混乱をしたため、上記作業のメモを元に、再度仕切りなおしをしました。
CodeIgniterを1.7.2にHMCV modular extensions 5219.zipを組み込み、その動作を確認しました。
/modules/{モジュール名}/controllers/{モジュール名}.phpの動作を確認
設置場所URL/index.php/{モジュール名}/
でアクセスできました。
/modules/{モジュール名}/controllers/{モジュール名と違う名前}.phpの動作を確認
この場合はURLは
設置場所URL/index.php/{モジュール名}/{コントローラ名}
でアクセスできました。
◆その後やったこと。◆
(HMVC) modular extensions 5217.zipのコードを拝見。
(=▽=).o(勉強になるなぁ♪)
(HMVC) modular extensions 5217.zipに+携帯関連のコードを追加しました。
携帯、PCを意識することなく、コードが書ける環境ができました。
◆課題◆
CIUnitを外してしまいました。
modular extensions 5217.zipでは、うまく動かなかったことと、
やはり本体の本体/system/codeigniter/CodeIgniter.phpを書き換えることが、やっぱり引っかかります。
テストをする仕組みを再度組み込む必要があります。
とりあえずは、unit_testクラスを使う方向で考えたいと思います。
メモ*テストを書くべき場所はどこか?*
CodeIgniterのUnit_testクラスでテストを書くなら、testコントローラを作って、そこにテストを書きたいなと思います。
controllerからcontrollerを呼べないわけだけれど、controllerからモデルもライブラリもヘルパーも呼べる。
ということは、呼ぶ、値を渡す、返ってくる値を評価するというお仕事は、controllerが適役。
modular extensions 5217.zipを組み込むと、モジュールから、他のモジュールのコントローラを呼ぶことが出来ます。これを利用して、とりあえずはunit_testクラスを使う方向で、使ってみようと思います。
echo modules :: run ( 'module/controller/method' , $param , $...);
参考サイト:
その後ですが、HMVCは一旦取り外してしまいました。
ごにょごにょしてたコードを一旦置いて、CodeIgniter1.7.1に対して、欲しかった機能を拡張するほうを優先しました。まだ私の理解力では足りない感じなので、順番に確実に進めていくことにしました。
この作業で、意識したのは次の3点。
(1)PCサイトと携帯サイトを構築するためのベースをつくる。
(2)PCサイトと携帯サイトをどう組み分けるか?を考える
(3)アプリとしての使い勝手と、アプリを組むために便利であることとのバランス。
(2)について。
愛読させていただいているCodeIgniter徹底入門では、携帯判定を行って、行った結果表示する情報量を減らす等の処理をして、モバイルとPCで両方使える掲示板の構築例がありました。コードを書く側から思えば、この方法のほうが、書くコードの量も少なくて楽です。そのようにしようと、サイトマップを作り始めたのですが・・・・・
実際アプリではなくてサイトとして考えると、PCと携帯を同時に考えるのは、結構複雑です。
携帯だけに実装したい機能、PCだけに実装したい機能、そしてそれらの機能に対する運用開始後の機能追加・・・を考えるとコントローラの中が結構複雑になってしまうし、作った人と運用後の機能追加をする人が違う場合には混乱しそうです。結局、コントローラを分けて、モデル、ライブラリは共通のものを使う方向で考えることにしました。。
モバイル対応が落ち着いたら、改めて挑戦したいと思います。
(=_=;).o(MyNETS2を素直に使えば良いとは思うんですよね・・・でももう少しそこに至るところまでを理解したいのです・・・・)
追記 2009.09.29
(=_=;).o0(追記の内容の方が、多いのでタイムスタンプを追記時間で書き換えました。)
やはりあきらめちゃダメだろうってことで、trac gitを用意。
とりあえずの携帯対応ができたCodeIgniter1.7.1を元にHMVCの組み込みを開始。
HMCV modular extensions 5219.zip
もう、HMVCエクステンションのバージョンがあがってる!!!
混乱して来たので、いままで触っていたものはそれはそれとして、置いておいて、
素の状態に、HMCV modular extensions 5219.zip を組み込んで、動くかどうか試してみた。
あっさりと、application/modules/{モジュール名}/以下のコントローラを読み込んでくれた。
また、モジュール名と同じコントローラ名でコントローラを作ったものは、コントローラ名を省略してくれている。モジュール名と違うコントローラ名の場合はURLが
モジュール名/コントローラ名/メソッド名
Machboxとほぼ同じ挙動になっている。
あとはmodelが動くかどうかも確認をしてみた。
class Model_welcome extends Model { function Model_welcome() { // Call the Model constructor parent::Model(); } function get_welcome() { $text = "Oh! Wecome Model !!!!"; return $text; } }
動いてほしいと思っていた部分が確実に動く事を確認できたので、
次は中身を理解するためにコードを読むことにしてみます。
CodeIgniter 1.7.1にHMVCを組み込みたいと思います。参考にさせていただいたサイトはhttp://d.hatena.ne.jp/dix3/20090828です。
Modular Extensions – HMVC
・(Google翻訳はこちら)
File:modular extensions 5217.zipをダウンロード後、application以下に設置ししました。 modules/welcomeを作成し、元々の1.7.1に梱包されていたコントローラ、とViewをコピーし保存。もともとのファイルを削除しました。 正常に動いているかどうかを確認するため、modules/welcome/views/welcome_message.phpを改変し表示確認。modules以下が参照されていることを確認しました。
Controller.phpとModel.phpの内容を修正。
大文字小文字の問題は、CIUnitを組み込む際にもひっかかった所なのでサイトを参考にさせていただきつつ、改変。
TODO:
・CIUnitの組み込み
・絵文字・携帯機能の組み込み
チェック中:http://sns.usagi-project.org/?m=diary&a=page_detail&target_c_diary_id=12433
チェック中:http://www.revulo.com/PHP/library/HTML_Emoji.html
チェック中・・・
kunitsujiさんってやっぱりすごいなと、MyNETS2の絵文字周り,携帯周りを見つつ再確認。←今ココ
携帯対応を後回しにして、とりあえず主目的だったCIUnitの組み込み中
Unit_testクラスで試し中
↑Unit_testクラスでテストを書いてみて思ったこと。
テストはコントローラで書いて、コントローラ以外のテストをする・・・・が良さそう。
ここらへんの思想はどうなってるんだろうか?
◆testコントローラを作って、モジュールのテストにUnit_testクラスを使う
ランゲージファイルが原因でのエラーが発生
unit_test_lang.phpのファイルの最後を?>で閉じたところ、エラーは解消されました。
◆結局やってる事と言うと・・・
MyNETS2の成り立ちをトレースしてる感じです。
今まで意識になく、でも考えなきゃいけなかったことを目の前のコードと動きが問題提起してくれてる感じ。お手本もあり、なんて恵まれてるんだろうと感謝感謝
◆CIUnitはというと・・・
CIUnitのために必要なライブラリの読み込みに失敗。
原因はなんとなくわかったけれども、まだ未解決。
◆1.7.1のセッションをDBに保存の部分
ユーザガイドのように設定してみたけれど、DB接続エラーが出ちゃう(><)
上記は解決。config/database.phpをうっかり上書きしてしまい、データベースの設定が消えていたと言う恥ずかしい原因・・・・・
1.7.1のユーザマニュアルのデータベースのテーブル設定部分
$config['sess_table_name'] = 'ci_sessions";
‘ではじまって”で閉じてるwww あわててたんだろうな♪
癒されました(^-^)
以前に作成した資料を拝見くださった方が、twitterにてフォローいただいたとのことなので、
現状手元にあるCIUnitがどのような状況なのか、書いてみたいと思います。
◆ネコネットデザイン事務所ホームページ
CodeIgniter 1.6.2に組み込み
modelを中心にテストを書いてみました。
運用サーバ上にテストをアップしないように、applicationフォルダ以下をSVN管理上のファイルとして扱い、
テストは自分だけに見える状態として扱ってます。
◆MyNETS2 にCIUnitを組み込み
リビジョン番号を控えわすれてますが、リポジトリからエクスポートさせていただいたのが2009年4月9日となっているので、かなり古いものです。確認しましたがその頃のファイルは残ってないようなので、現在レポジトリで公開されているものとは中身が違うようです。
設定ファイルの設定でCIUnitのON OFFを制御させています。
テストコードも複数人で共有できるようにSVN管理しています。
現在これをベースに組んでいたものは、途中でやる気を失ってしまい放置状態ですorz
この時点で発生した問題としては、セッション系の部分とモバイル、PCの判定部分を突破できず、コントローラのテストはできませんでした。モジュール、ヘルパー、ライブラリに関してはphpUnitは正常に動作し、テストが実行できる状況が作れています。
この2ヶ月ほどは、7月頭ぐらいにコミットされてるリビジョンのMyNETS2をいじっていますが、まだそれにはCIUnitは組み込んでいません。CIUnitとは違う方法でのphpUnitの利用を模索中です。
◆まだTDDにはたどり着いていないという事
去年のOSC、
そしてt-wadaさんの「TDDテスト駆動開発」を拝見してから、テストせねばということでテストをするということに取り組んでるわけですが、実際のところまだTDDの、「先にテストを書く」というところには、まだたどり着いていません。
コードを書く→ちゃんと動くかテストを書く→テストを動かしてみる。
私はついつい長々とコードを書いてしまうので、
処理を分割する→テストを動かす→うごいてる♪
な、動作の確認にもテストを動かして、確認をしている感じです。
CIUnitで書いているテストは、Modelに対して行っています。
少しずつですが、最近はhelperに対するテストを書き始めました。
不器用なので、まだテストという技術を身につけるには至っていないと思いますが、少しずつできるようになってきているのかなと感じています。
◆コントローラのテストに対する考え
MyNETS2に組み込んだCIUnitも素の状態の1.6.2に組み込んだCIUnitも、
現状Controllerのテストはやりにくい状態です。
この部分は、無理にUnitテストではなく、目視での確認
バッチでコントローラを走らせた後に、DBの値を検証をする、もしくはWebアプリケーション用のテストツールSelenium等を利用した、別の形で行うのが良いかと思っています。
model,helper,ライブラリ等で、何を投げて何が返ってくるのかにだけ注目し、他は行わないという割り切りがあっていいかなと思っています。