前回php勉強会にて、testモジュールを作りたいよということを発表しました。
http://pneskin2.nekoget.com/press/?p=371
で、MyNETS2のレポジトリを覗いてみたところ、kenjiさんが testモジュールでPHPUnitを実現していました。
すごいよkenjiさん!!!
http://usagi-project.org/redmine/repositories/diff/mynets2?rev=1295
前回php勉強会にて、testモジュールを作りたいよということを発表しました。
http://pneskin2.nekoget.com/press/?p=371
で、MyNETS2のレポジトリを覗いてみたところ、kenjiさんが testモジュールでPHPUnitを実現していました。
すごいよkenjiさん!!!
http://usagi-project.org/redmine/repositories/diff/mynets2?rev=1295
MYNETS_url_helper.phpをr1190へ更新。
ちょいエラーが出るので、331行目を修正
function auto_link_callback($matches)
↓TRUEでも良かったとは思うんだけど、全部ポップアップはめんどくさいので。
function auto_link_callback($matches,$popup=FALSE)
追記:2009.08.22
http://usagi-project.org/redmine/repositories/diff/mynets2?rev=1195
preg_replace_callback でコールバック関数に $popup を渡せないのでということで、Class化されたらしい。
class Auto_link になってた。
後でファイルを入れ替えておこう。
・・・・テスト書かないとだめだなぁやっぱり(><)
とりあえずメモ。
モジュール名とか、知りたい時は$this->matchbox;をつつくと良い気がする。
var_dump($this->matchbox);
モジュール名htmlの場合での結果。
object(CI_Matchbox)[6] public '_callers' => array 0 => string 'Loader' (length=6) 1 => string 'Matchbox' (length=8) 2 => string 'MY_Config' (length=9) 3 => string 'MY_Language' (length=11) 4 => string 'Parser' (length=6) public '_directories' => array 0 => string 'modules' (length=7) public '_directory' => string 'modules/' (length=8) public '_module' => string 'html/' (length=5)
追記2009.09.10
__FUNCTION__ で現在実行しているメソッド名を取得できる・・・・メモ〆(。。)
まずはSKINまわりから。
今搭載されてる構造を変更。
ベースとなるCSSファイル+画像ファイルをdefaultとして設置する。
モジュールごとにCSSファイルを設置
モジュールのCSSファイルに、ベースとなるCSSを読み込ませて基本となるCSSの設定にする。
テーマごとに、フォルダを切り替えたりなんてことも考えたんだけど、
ZIPファイルでテーマファイルを別の場所に保存しておいて、/theme/になるように展開したり、
管理機能からCSSを編集したり、フォルダごとzipに固めてバックアップをとったりできるとよさげだなと思ったので、/theme/以下に1テーマってことにしてみる。
基本SKIN
/theme/default/main.css /theme/default/css/xxxx.css /theme/default/images/xxxxx.jpg
モジュール別のスキン
/theme/{モジュール名}/css/main.css /theme/{モジュール名}/css/xxx.css /theme/{モジュール名}/images/xxxx.jpg
/theme/{モジュール名}/css/main.cssの中身はこんな感じ
@charset "utf-8"; /* CSS Document */ /*基本CSSを取得 --------------------------------*/ @import url("../default/main.css");
…以下cssフォルダの中のパーツ分けしたCSSファイルを順次import
1モジュール毎にCSSを設定。
基本となるSKINの情報はdefaultから取得する
共通部品のjavascript、javascriptライブラリ等
/shared/js/xxxx.js等 /shared/js/{ライブラリ名}/パーツ
メモ:
modules以下のmodel,library,helperのテストが、CIUnitでできるようになりました。
modules以下のControllerとviewはまだphpunitが実行できる状態にまで辿りつけていません。
adminモジュールのModel_adminで、少しはまりました。
$this->_user_id = $this->CI->session->userdata('user_id');
の処理を通過させるために、setUp()の中で、次のコードの記入が必要でした。
adminモジュールのModel_adminの31行目
$this->CI->session->userdata(‘user_id’);で、user_idを渡している箇所のために、記載。
ひょっとしたらsessionではなく違うカタチでuser_idを渡せれば、もっと良いのかも。
$this->CI->load->file(APPPATH.'libraries/session/MYNETS_Session.php');
$this->CI->session = new MYNETS_Session;
実行をすると次のように表示されます。
Warningは出ますが、テストは実行できます。
$ phpunit testSomeModel.php
PHPUnit 3.3.16 by Sebastian Bergmann.
<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">
<h4>A PHP Error was encountered</h4>
<p>Severity: Warning</p>
<p>Message: Cannot modify header information - headers already sent by (output started at /usr/share/pear/PHPUnit/Util/Printer.php:168)</p>
<p>Filename: libraries/Session.php</p>
<p>Line Number: 663</p>
</div>.
Time: 0 seconds
OK (1 test, 0 assertions)
追記:2009.06.12 3:19
modules以下のcontrollerはとりあえず諦めようかなという気分です。
APPPATH.controller/以下のcontrotterもOUTPUTがあるかどうかのテストだけみたいだし・・・(言い訳)
modulesのmodelのテストで、
$this->_user_id = $this->CI->session->userdata('user_id');
が使われている場合の処理について、前回のやり方だと、AllTests.phpの実行時にエラーが発生するので、次のように修正。
if(!isset($this->CI->session)){
$this->CI->load->file(APPPATH.'libraries/session/MYNETS_Session.php');
$this->CI->session = new MYNETS_Session;
}
$this->CI->session->userdata('1');
なんだかもう少しな気がしてきたよ。
今現在の状況で言えば、
modules以下の本当にテストをしたい箇所がテストが出来ませんが、
動くところまでもっていくことができました。
ただ、MyNETS2のコードを書き換えての対応なので、
あまりよくない対応です。
Loader.phpのモバイルかどうかを判定して、
モバイル用のviewファイルがあれば、
そっちをとりにいく処理を
コメントアウトして動かしてます・・・・orz
あきらめずにコードを追いたいと思います。
追記:2009.06.07
CodeIgniterの話題とMyNETS2(アプリケーションプラットフォーム)との話題の差がわかりにくいので画像を作成してみました。MyNETS2の話題に関してはしばらくこれを使おうかなと思います。
さらに追記:2009.06.07 17:36
コメントアウトした部分は、携帯からのアクセスの場合、携帯用のviewフォルダにファイルがあればそっちを読むべし的な処理部分でした。1つのコントローラが、件数の表示を切り替えるにしても同じコントローラを使う場合使わない場合もありそうなので、コメントアウトのままでもいいかもしれないと思い始めています。・・・・でもやっぱりあったほうがいいのかなぁ・・・・(汗)
管理者のログインとか認証関連
元のがよくわからなかったので、作っちゃう事に。
管理用テーブルを作成
CREATE TABLE <code>admin</code> (
<code>id</code> INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
<code>user_id</code> INT( 11 ) NOT NULL ,
<code>level</code> INT( 1 ) NOT NULL ,
<code>create</code> TIMESTAMP NOT NULL ,
<code>update</code> TIMESTAMP NOT NULL
) TYPE = MYISAM ;
levelは権限レベル 1はALL 0は無効
数字が増えて行くにつれて、アクセスできる箇所を減らして見ようかなと思ってる。
とりあえずは有効無効設定的に使用
こんな感じでjoinさせて検索しちゃえばいいかなと。
管理ユーザ専用のID,PASSを保存するテーブルをとも思ったけども
モジュール別に管理権限とかつけたくなるかもしれないし。
管理者名は別にあってもいいかもしれない。
後からカラムを追加してみよう・・・・〆(。。)
joinだとこんな感じになるかな・・・・〆(。。)
$this->db->select('*');
$this->db->from('user');
$this->db->join('admin', 'admin.user_id = user.user_id);
$this->db->where('user_id, $user_id);
$this->db->where('level', 1);
$query = $this->db->get();
1.6.3のユーザーガイド(MyNETS2は1.7ベースらしい)
http://codeigniter.jp/user_guide_ja/database/active_record.html
whereの指定は、「4. 自由に指定できる文字列を使用する方法」の書き方の方が好みなので、こっち採用〆(。。)
4. 自由に指定できる文字列を使用する方法:
WHERE句の中身を自分で書くこともできます:
$where = “name=’Joe’ AND status=’boss’ OR status=’active'”;$this->db->where($where);
adminモジュールを書き換えちゃうのもあれなので、
nekogetモジュールを作成
主な役割は会員管理
ここでは、adminテーブルは使わない、会員(user)の管理を行う
機能はきっとこれぐらいあればきっと大丈夫・・・・〆(。。)
スキン関連のフォルダ構成の変更
モジュール名/main.css の頭で、default/main.cssを読み込む。
モジュール名/main.cssはdefault/main.cssでたりない設定を追記していく
もしくはdefaultの設定を読み込まず、単独の設定を作るベースのCSSファイル
フォルダもしくはファイルで分けて、表示画面別のCSS、Controllerが制御するもの別のCSSファイルを個別に呼び出せるようにする。
この部分はControllerでの制御は避けて、View側で対応させたいな
・・・・〆(。。)備忘録的にメモ
モジュールの中に、MyNETS2のバージョンとベースのCodeigniterのバージョン番号の情報をどこかに保存しておかないと、
モジュールだけを作ったり、設置したり、外したり、配ったりするのに困りそうだ。
どこかに情報を書き込んでおこう〆(。。)
続きはまた夜にでも勉強しつつやってみる予定。
〆(。。)トランザクション処理
http://codeigniter.jp/user_guide_ja/database/transactions.html