拡張
外部ライブラリ
フレームワークとは別に開発者が独自に作成したクラスや他のPHPライブラリのクラスを__autoloadで読み込んで使用することが可能です。
にクラスファイルや(クラスファイルを格納した)ディレクトリを設置すると、そのプログラムはフレームワークの実行時にオートロードされます。このディレクトリ内のプログラムはすべてオートロードされるため、その分メモリを消費することに留意してください。
クラス名は任意に付けてそのまま使用することができますが、同じ名前のクラスがあった場合先に読み込んだほうが適用されます。
フレームワークの拡張
開発者が独自に開発したクラスでフレームワークそのものの機能を拡張することができます。
にクラスファイルや(クラスファイルを格納した)ディレクトリを設置すると、そのプログラムはフレームワークの実行時にオートロードされます。外部ライブラリはアプリケーションごとに適用されるオートロードですが、この機能はフレームワークそのものの拡張機能としてあらゆるプロジェクトを呼び出す際に適用されます。外部ライブラリと同様にこのディレクトリ内のプログラムはすべてオートロードされるため、その分メモリを消費することに留意してください。
クラス名は任意に付けてそのまま使用することができますが、同じ名前のクラスがあった場合先に読み込んだほうが適用されます。アプリケーションの外部ライブラリとフレームワークの拡張はいずれもフレームワーク実行時にオートロードされる共通クラスとして名前の区別がありませんので、名前が重複しないようにしてください(重複した場合は外部ライブラリのものが優先されます)。
フレームワーク内部のオブジェクトの呼び出し
通常Webアプリケーションフレームワークは画面表示(ビュー)がセットになりますが、画面は不要だがフレームワークの機能を使用したいこともあります。たとえばAPIとして外部からデータの登録を行う、他のアプリケーションからデータの取得のみを行うといった場合です。このようなときフレームワーク内部のオブジェクトを外部のプログラムで呼び出して使用することが可能です。
フロントコントローラ(フレームワークを呼び出すプログラム)でChimpanzeeのインスタンスを取得し、
require_once '/path/to/Chimpanzee-X.X/Chimpanzee.php'; $cz = new Chimpanzee('/path/to/project01', 'pc');
インスタンスからメンバ変数objを取得すると以下のメソッドで各フォーム、モデル、定数テーブル、ユーザ定義関数を呼び出すことができます。
- newModule($name)
- loadModule($name)
- unloadModule($name)
- newModel($name)
- loadModel($name)
- unloadModel($name)
- newForm($name)
- loadForm($name)
- unloadForm($name)
- newFunc($name)
- loadFunc($name)
- unloadFunc($name)
- newTable($name)
- loadTable($name)
- unloadTable($name)
- unloadAll()
$cz->obj->newModel('Model1');
画面が不要なプログラム
APIのようにデータをCSVやXMLなどの形式で出力し、画面を出力しないプログラムがあります。このような場合はフロントコントローラでexec()する代わりに以下のようにします。
<? try { require_once '/path/to/Chimpanzee-X.X/Chimpanzee.php'; $cz = new Chimpanzee('/path/to/project01', 'api'); echo json_encode($cz->obj->newModel('item')->getRecords()); } catch (CZException $e) { echo 'Fatal error: ' . $e->getMessage(); } ?>
フロントコントローラで
$cz->obj->...
とするとフレームワーク内部のオブジェクトをそのまま呼び出すことができます。
ちなみにこれはモデルからレコードセットを取得し、JSONで出力するAPIです。このプログラムは以下のJavascriptからAjaxで呼び出されます。
<script type="text/javascript" src="<?= $_js_url; ?>/jquery-1.6.1.min.js"></script> <script type="text/javascript"> var item_json; function setItemTable() { var item_id = $("#item_id"); item_id.children().remove(); item_id.append('<option value="">(選択してください)'); var item_category_id = $("#item_category_id").val(); if (item_category_id != "") { $.each(item_json[item_category_id], function(id, value) { item_id.append('<option value="' + id + '">' + value + '</option>'); }); } } $(document).ready(function(){ $.ajax({ type: "GET", url: "<?= $_api_url; ?>/get_item_json.php", success: function(result) { item_json = eval("(" + result + ")"); } }); });
外部プログラムからの呼び出し
既存パッケージのカスタマイズでChimpanzeeを利用するなど、PHPで実装された他のプログラムからChimpanzeeを呼び出すことも可能です。その場合呼び出し元のプログラムで上記と同様に
: try { require_once '/path/to/Chimpanzee-X.X/Chimpanzee.php'; $cz = new Chimpanzee('/path/to/project01', 'api'); $rec = $cz->obj->newModel('item')->getRecords(); // $rec を使った処理 : } catch (CZException $e) { echo 'Fatal error: ' . $e->getMessage(); } :
を実行します。
特定のアプリケーションを指定しない
Chimpanzeeの第2引数を省略することで特定のアプリケーションを指定しない、すなわち_commonのみを参照することが可能です。
require_once '/path/to/Chimpanzee-X.X/Chimpanzee.php'; $cz = new Chimpanzee('/path/to/project01');
携帯電話からのアクセスの振り分け
フレームワーク内部オブジェクトの呼び出し機能を応用して、フロントコントローラでモジュールMobileを呼び出し、携帯電話からのアクセスを振り分ける処理です。携帯電話からの入力エンコーディングがSJISであるため、その指定も行っています。
<? try { require_once '/path/to/Chimpanzee-X.X/Chimpanzee.php'; $cz = new Chimpanzee('/path/to/project01', 'pc'); if ($cz->obj->newModule('mobile')->isMobile()) { $cz->setApplicationName('mobile'); $cz->obj->newModule('request')->setEncoding('SJIS'); ini_set('mbstring.http_output', 'SJIS'); } $cz->exec(); } catch (CZException $e) { echo 'Fatal error: ' . $e->getMessage(); } ?>
CZFuncクラス
フレームワーク内部の問題になるのですが、コントローラ、フォーム、モデル、ユーザ定義関数はすべてCZFuncというクラスを継承しています。このクラスでは以下のメソッドを使用することができます。
- newModule($name)
- loadModule($name)
- unloadModule($name)
- newModel($name)
- loadModel($name)
- unloadModel($name)
- newForm($name)
- loadForm($name)
- unloadForm($name)
- newFunc($name)
- loadFunc($name)
- unloadFunc($name)
- newTable($name)
- loadTable($name)
- unloadTable($name)
- unloadAll()
- forward403()
- forward404()
- save($var_name, $value)
- load($var_name, $defalt_value = NULL)
- free($var_name)
- freeAll()
コントローラ(アクション)に限らずフォームやモデル、ユーザ定義関数から他のモデル/フォーム/モジュール/ユーザ定義関数/定数テーブルのロードとアンロードができるのです。また403転送や404転送、セッション変数のセーブやロードもできます。この仕組みを利用してユーザ定義関数などで幅広いフレームワーク内の機能を使用することが可能になっています。
前後のページ
- 前ページ:ファイル操作モジュール