テンプレートファイルの記述方法

テンプレートファイルはネイティブPHP(+HTML)で記述します。独自の記法は使用しておりませんので、条件分岐などの制御構造もPHPの記法そのまま

<? if(): ?>~<? endif; ?>
<? else: ?>
<? elseif(): ?>
<? foreach(): ?>~<? endforeach; ?>

などが利用できます。

<html> 
<head> 
<title>ビューのテスト</title> 
</head> 
<body> 
	<h1>ビューのテスト</h1>
	<p>Chimpanzeeのビュー機能のテストです。</p> 
</body> 
</html>

プログラムで取得したデータをビュー変数として渡すことも可能です。

コントローラ

<?
class ctrlXxx extends CZCtrl {
	public function actionYyy() {
			:
		$msg = 'ようこそ、Chimpanzee projectへ。';
		$recs = $this->newModel('Xxx')->getRecords( ...
		$this->addViewVar('msg', $msg);
		$this->addViewVar('recs', $recs);
	}
}
?>

ビュー(テンプレート)

<html> 
<head> 
<title>ビューのテスト</title> 
</head> 
<body> 
	<h1>ビューのテスト</h1>
	<p><?= $msg ></p>
	<? foreach($recs as $rec): ?>
		IDは「<?= $rec['id'] ?>」、名前は「<?= $rec['name'] ?>」です。
	<? endforeach; ?> 
</body> 
</html>

このメソッドの詳細はアクションからビューに変数を渡すを参照してください。

インクルード

Webページのヘッダ、フッタや左右のカラムの内容など、各ページに共通の表示部分は別ファイルとしてインクルードすることも可能です。

ヘッダとフッタ

全ページ(アクション)でヘッダとフッタは自動的にインクルードするようになっています。

ディレクトリ(app_root)/views/コントローラ名header1.htmlheader5.htmlheader.htmlがあればヘッダとして、footer1.htmlfooter5.htmlfooter.htmlがあればフッタとして読み込まれます。

ヘッダの読み込む順番は
header1.htmlがあれば最初に
header2.htmlがあればその次に

header5.htmlがあればその次に
header.htmlがあればその次に
読み込みます。

フッタの読み込む順番は
footer.htmlがあれば最後に
footer5.htmlがあればその前に
footer4.htmlがあればその前に

footer1.htmlがあればその前に
読み込みます。

これらのファイルがなければ読み込みません。ページ本体はheader.htmlfooter.htmlの間に読み込まれることになります。

コントローラごとにディレクトリが分かれていますのでコントローラごとに適用可能です。アクショングループごとではないことに注意してください。また共通テンプレートのディレクトリ(app_root)/views/_commonheader1.htmlheader5.htmlheader.htmlfooter1.htmlfooter5.htmlfooter.htmlによって全体で共通のヘッダとフッタを適用することも可能です。

逆にいうとディレクトリ(app_root)/views/コントローラ名にヘッダやフッタのファイルがない場合、(app_root)/views/_commonのヘッダやフッタのファイルが自動的に読み込まれてしまいます。

プロジェクトテンプレートの(app_root)/views/_commonには_header.html_footer.htmlが含まれています。頭にアンダーバー「_」がつくファイルはフレームワーク実装済みのファイルで、これらもheader.htmlなどと同様にヘッダやフッタとして機能します。開発者がheader.htmlなどを利用してヘッダやフッタを実装する場合はこれらのファイルを消す必要があることに注意してください。

ヘッダ、フッタともに通常のテンプレートと同様にビュー変数が利用できます。

ファイル名を指定したインクルード

ヘッダとフッタ以外のファイルは個別に明示的にインクルードする必要があります。テンプレートファイルはPHPで記述するため、PHPのrequire_once()関数を利用してインクルードするファイルを指定します。

その際インクルード対象の絶対パスで渡す必要があるのですが、それを支援する機能としてコントローラのメンバ変数_views_dirでビューディレクトリのプルパスを取得できます。これを利用して

require_once($_views_dir.'viewsディレクトリからの相対パス');

とすれば相対パスで指定することができます。たとえば(app_root)が

/home/test/apps/app01

のときテンプレートファイルで

require_once($_views_dir . DIRECTORY_SEPARATOR . 'test.html');

とすれば

/home/test/apps/app01/views/test.html

をインクルードします。

ビュー変数

開発者が上記のように指定したビュー変数以外にテンプレートファイルの中で使用できるビュー変数です。 設定ファイル{(app_root), _common}/configs/View.phppredefined_var_enable_flagTRUEの場合に使用できます。デフォルトの設定ではメモリ節約のためこのオプションがFALSEになっているので注意してください。 アクション名やURLを変数の形で取得できますので、HTMLの構造は同じなのにリンクのアドレスだけ書き換えてテンプレートファイルを書き分けていたような場合は、これらを利用して複数のコントローラで共通のテンプレートファイルを適用することが可能になります(_common)。
プロパティやメソッドの形で取得します。

なおURLを返すタイプのビュー変数では末尾の「/」が付きません。配下のファイルを指定する場合はPHP定数DIRECTORY_SEPARATORなどを使用してください。

プロパティ

$_action_name
現在のアクション名
$_action_group_name
現在のアクショングループ名
$_ctrl_name
現在のコントローラ名
$_views_dir
テンプレートルートの絶対パス
$_err_msg
エラーメッセージ($_errと同じ)
$_self_url
現在のURLを取得します。リクエストパラメータは付きません。
$_root_url
トップページ(フロントコントローラ)のURLを取得します。
$_return_url
現在のアクショングループのに遷移する直前にいたURLを取得。CZCtrl::_redirectReturn()のリダイレクト先のURLとなります。アクショングループを適用した場合のみ取得可能です。
アクショングループを適用していない場合や現在のアクショングループにアプリケーション外から直接遷移してきた(直前のURLがない)場合はFALSEを返します。たとえば以下のような使い方をします。
<? if ($_return_url): ?>
<a href="<?= $_return_url; ?>">戻る
<? endif; ?>
設定ファイル{(app_root), _common}/configs/Forward.phpの「戻る」設定return_flagがTRUEの場合にのみ有効となります。ホームページ(デフォルトコントローラ)へ遷移すると、戻り先URLのセッションデータは削除され、この機能は使えなくなります。ただし
http://mydomain.com/home
などのようにコントローラ名がURLにある場合は削除されません。
$_image_server_url
画像表示サーバ(ChimpanzeeImageServer.phpを呼び出すフロントコントローラ)のURLを取得します。設定ファイルImage.phpserver_urlの設定を反映します。
$_images_url
画像格納パスのURLを取得します。設定ファイルURL.phpimagesもしくはimages_relative_pathの設定を反映します。
$_css_url
CSS格納パスのURLを取得します。設定ファイルURL.phpcssもしくはcss_relative_pathの設定を反映します。
$_js_url
Javascript格納パスのURLを取得します。設定ファイルURL.phpjsもしくはjs_relative_pathの設定を反映します。
$_api_url
フレームワークとは別に呼び出すAPIなどのURLを取得します。設定ファイルURL.phpapiもしくはapi_relative_pathの設定を反映します。
$_facebook_url
FacebookのルートURLhttp://www.facebook.com/
$_twitter_url
FacebookのルートURLhttp://twitter.com/

URLを返すメソッド

テンプレートファイルの中で

$this->url(array('index'));

のように$this->の形式で以下のメソッドを実行すると指定したアクションのURLを取得できます。

_url(array $action, $secure_flag = FALSE)
引数$actionで指定したアクションのURLを取得します。$actionアクション形式の配列で、第1要素がアクション名、第2要素がアクショングループ名、第3要素がコントローラ名となります。コントローラ名にFALSEを指定した場合、現在のコントローラと同じコントローラの、アクショングループ名にFALSEを指定した場合、現在のアクショングループと同じアクションを指します。$secure_flagでリダイレクト先を「https://」にするか「http://」にするかを指定できます。TRUEにすると「https://」で始まるセキュアなURLにリダイレクトします。アクショングループを適用する場合はurl()ではなくこのメソッドを使用してください。
url(array $action, $secure_flag = FALSE)
引数$actionで指定したアクションのURLを取得します。$actionアクション形式の配列で、第1要素がアクション名、第2要素がコントローラ名となります。コントローラ名にFALSEを指定した場合、現在のコントローラと同じコントローラのアクションを指します。$secure_flagでリダイレクト先を「https://」にするか「http://」にするかを指定できます。TRUEにすると「https://」で始まるセキュアなURLにリダイレクトします。アクショングループを適用しない場合は_url()ではなくこのメソッドを使用してください。

テンプレートファイルの中でユーザ定義関数を利用する

テンプレートファイル内で表示する値を変換などユーザ定義関数を利用する場合にこのメソッドを使用します。

func(string $name)
テンプレートファイルの中で指定したユーザ定義関数オブジェクトを返します。インスタンスを取得し、メソッドを実行する形でユーザ定義関数を実行します。たとえば以下のように実行します。
<h3><?= $this->func('クラス名')->メソッド('引数') ?></h3>

アクションからビューに変数を渡す

アクションからビューを呼び出す際、変数としてアクションの中で取得生成したデータを渡すことも可能です。アクションの中でCZCtrl::addViewVar(string $var_name, string $value, $escape_flag = TRUE, $ignore_escape_keys = array())を実行します。

このメソッドはビューの中で使う変数(ビュー変数)$var_name$valueの値を代入します。$escape_tags_flagがTRUEもしくは指定しない場合、$value中に含まれるHTMLタグ要素はエスケープ処理して表示可能な文字列に置換します。FALSEの場合タグ要素をそのままタグとして代入します。レコードのような連想配列を渡す場合、$ignore_escape_keysでエスケープ対象から除外するキーを指定することもできます。エスケープに関する指定の詳細はこちらも参照してください。

たとえば

$x = 1 + 2;
$this->addViewVar('a', $x);

とした場合、テンプレートファイルの中で

1 + 2は「<?= $a ?>」です。

と記述することで

1 + 2は「3」です。

と表示できます。メソッドdisplay(string $file)と同時に実行する場合、display()はビューを呼び出すメソッドですのでaddViewVar(string $var_name, string $value, bool $escape_tags_flag = TRUE)を先に実行します。

ビューの呼び出し

通常は上記のようにアクションと同じ名前のテンプレートファイルを自動で適用して表示しますが、違う名前のファイルを適用したい場合読み込むファイル名を明示することも可能です。その場合アクションの中でCZCtrl::display(string $file)を実行することで、指定したテンプレートファイルを適用して表示します。画面表示処理は最後に行うのが普通ですので、アクションの最後にこのメソッドを記述します。テンプレートファイル名や配置パスについてはテンプレートファイル名と配置パスも参照してください。

アクションの戻り値をfalseにする、すなわちアクションの最後で

return false

とすることでビュー機能を使わない(テンプレートファイルを適用しない)ことも可能です。

たとえばコントローラctrls/Xxx.php

<?
class ctrlXxx extends CZCtrl {
	public function actionYyy() {
			:
		$rec = $this->newModel('Xxx')->getRecord( ...
		$this->addViewVar('rec', $rec);		// レコード(連想配列)
		$this->addViewVar('title', 'レコード表示テスト');
	} // 「(app_root)/views/xxx/yyy.html」を適用

	public function actionZzz() {
			:
		$recs = $this->newModel('Xxx')->getRecords( ...
		$this->addViewVar('recs', $recs);	// レコードセット(2次元配列)
		$this->addViewVar('title', 'レコードセット表示テスト');
		$this->display('test.tpl');
	} // 「(app_root)/views/xxx/test.tpl」を適用
		:

	public function actionWww() {
			:
		return false;
	} // ビューを適用しない
}
?>

テンプレートファイルviews/xxx/header.html

<html>
<head>
<title><?= $title ?> | オープンソースPHPフレームワークChimpanzeeテスト</title>
</head>
<body>
<h1><?= $title ?></h1>

テンプレートファイルviews/xxx/footer.html

<div id="footer">
<address>©(C) 2011 XXX Corp. All Rights Reserved.</address>
</div>
</body>
</html>

テンプレートファイルviews/xxx/yyy.html

<dl>
<dt>ID</dt><dd><?= $rec['item_id'] ?></dd>
	:
<dt>価格</dt><dd><?= $rec['price'] ?></dd>

</dl>

テンプレートファイルviews/xxx/test.tpl

<table>
<tr>
<th>ID</th>
	:
<th>価格</th>
</tr>
<? foreach($recs as $rec) : ?>
<tr>
<td><?= $rec['item_id'] ?></td>
	:
<td><?= $rec['price'] ?></td>
</tr>
<? endforeach; ?>
</table>

自動生成

Chimpanzeeでは一覧表や編集画面(フォーム)などのHTMLを自動生成することも可能です。Chimpanzeeの自動生成機能では、携帯電話からのアクセスに対しては携帯電話での表示に適したHTMLを生成します。携帯電話版では全角カタカナを半角カタカナに変換し、自動生成するHTMLに関する情報の設定に基づいて携帯電話に適したHTMLで出力します。たとえばPCでは<table>タグで出力するところを携帯電話では<br />でレイアウトするなどの処理をします。

一覧表

一覧表を参照してください。

詳細画面

詳細画面を参照してください。

編集画面

入力画面の自動生成、フォームとモデルを連携する場合は編集画面も参照してください。

確認画面

確認画面を参照してください。

前後のページ

ページトップへ