CodeIgniterの学習 49 - HMVCを使ってブログパーツチックにコントローラやビュー内で別コントローラ(とそのビュー)を呼べるようにするその1

今日は、HMVCの拡張を使って、モジュール単位でのソース管理(機能管理)を実現する。
(記述することが多いので今日から数日に分ける。今日はまず概念から。)


コントローラやビュー(ブログパーツチックなビューの一部)、
ライブラリを小分けに管理したくなったときの一つの解決方法。

xoopsdrupalのモジュールのようにソースを小分けにまとめた構成のプログラム群を作りたい場合に有効と思われる。

パーツ単位での開発の外部委託とか、CMSプラグイン(モジュール)開発とかいろいろ使い道はあるかと。


元ネタは、http://codeigniter.com/wiki/Modular_Extensions_-_HMVC/

なお、PHP5専用のversion 5.1について書く。PHP4は知らん。


CodeIgniter標準との違い

ある小さな機能(例えば何かのカレンダーだけとか、何かのバナー機能とか、
地図機能とか 以後モジュールと表記)を、
複数の機能で使い回したいときに、CodeIgniter標準の状態でやろうとすると、

(CodeIgniter標準)
ヘルパ又はプラグイン又はライブラリを作って処理を記述し、
各コントローラ内(ビュー内)毎にてその都度組み立てが必要になる。
結果同じような記述が複数ソースに書かれることになる。


(HMVC拡張)
大きなコントローラ(呼出元のコントローラ)内で、別コントローラ(モジュール内のコントローラ)を呼べる。
大きなビュー内(呼出元のビュー)内で、モジュール側のコントローラを通過したビューを差し込める。

呼びだし側での組み立てが不要なので、数行の貼り付けのみで複雑なパーツを、あちこちに埋め込めるように出来る。


以前書いた大枠のビュー、中身のビューの構成に加えてさらに、
中身のビューの中に、複数のモジュールのビューが埋め込まれている構成と考えてください。
うまくモジュールでラッパーするとCodeIgniter以外で作られた機能の読み込みも出来るんじゃ無かろうか。



画面

俺のつたない語彙力ではうまく表現出来ないので、画面を貼っておく。
下の画面上の緑色部分が、HMVCのモジュールを通過した例。

なおこのモジュールは、http://codeigniter.com/wiki/Captcha_simple_maths_for_HMVC_4.1.x/
を微改造して、モジュール側にもビューを持たせたモノ。(HMVCのVersion 5.1でも使えた)

HMVCの仕組みを使ってモジュールを作り込めば、複雑な機能をあちこちで共有できると思う。

全部の機能をモジュール分割して作ることも出来るだろう。
まあ分割しすぎも煩雑になるのでほどほどに。



あと、ここでは親のビュー(例 http://citest.example.com/tasklist/edit/)から、
モジュール側のコントローラ・ビューを呼び出しているが、

直接モジュールのURL(例 http://citest.example.com/kcs_captcha_module/
を呼び出すと、そのモジュールだけのコントローラを呼ぶことも出来る


完全にモジュール分割したアプリ構成ではこれでいいだろうが、

上の画像のようにパーツチックに差し込むだけ(コントローラから別コントローラを呼ぶ)の使い方に限定し、
モジュールのコントローラを直接呼び出されたくない場合には、
HMVCのMY_Routerの変更が必要
だと思う。(詳細は明日書く)。

気をつけないとうっかり直接呼び出されたくない機能を外部に晒しかねないので要注意だと思う。



呼びだし側ソース例

呼出側はこんな感じ

1)親側のビュー:application/views/tasklist_edit.php

(上略)

<label>郵便番号</label>
<input type="text" name="zipcode" id="zipcode" value="<?=$this->validation->zipcode;?>" size="10" />
<p id="zipcode_error"><?=$this->validation->zipcode_error; ?></p>


<label>HMVCモジュールの実験<em>*</em></label>
<?= modules::run('kcs_captcha_module') ?> 

(下略)
modules::run('モジュール名')

のタイミングで、モジュール側のコントローラが呼び出され、
その結果を貼り付けている。

まさにブログパーツチック。


2)モジュール側のビュー:application/modules/kcs_captcha_module/views/test_parts_view.php

<div style='background:#00ff00;'>

<h3><?=$title?></h3>

<?=$question?><br>

<?=$fugafuga?><br>

</div>

上の画像の緑色の部分。
モジュール側のコントローラ:application/modules/kcs_captcha_module/controllers/kcs_captcha_module.php
を通過して、このビューを吐いている。


3)モジュール側のコントローラのソース:
省略。



呼びだし側のコントローラで、モジュール側のメソッドを呼び出す方法

http://codeigniter.com/forums/viewthread/81446/P270/ にある通り。
こんな感じで呼べる。

<?php
//上略

  if( modules::load('kcs_captcha_module')->validate($this->input->post('hmvctest')) ){
    echo '1の呼び方で、TRUEが戻ってきた<hr>';
  }else{
    echo '1の呼び方で、FALSEが戻ってきた<hr>';
  }


  if( $this->load->module('kcs_captcha_module')->validate($this->input->post('hmvctest')) ){
    echo '2の呼び方で、TRUEが戻ってきた<hr>';
  }else{
    echo '2の呼び方で、FALSEが戻ってきた<hr>';
  }


  $objhoge = $this->load->module('kcs_captcha_module');

  if( $objhoge->validate($this->input->post('hmvctest')) ){
    echo '3の呼び方で、TRUEが戻ってきた<hr>';
  }else{
    echo '3の呼び方で、FALSEが戻ってきた<hr>';
  }

//下略
 ?>


上の3つのどの呼び方も同義。

値 = $this->load->module('モジュール名')->メソッド名(引数) ;

みたいな呼び方。




インストールとモジュールの構成

インストール方法等の記述は明日。



全然関係ないけど、
昨日開発環境を一気にFedora8からFedora10にあげたらすげーはまった。やっぱdebian系の方が好きだわ。