onInitでセットされたリソースや値を出力します。display()メソッドでHTMLページを出力する他に、AJAX用JSONやphpシリアライズ、エクセルファイルダウンロードなどアウトプットフォーマットを変えて出力できます。
HTMLページとして標準出力する場合はdisplay()メソッドを使います。
public function onOutput()
{
$this->display($tpl);
}
$tplは省略できます。省略すればページ名に従ったテンプレートが使われます。例えばPage_User_Index
という/user/index.phpのページで実行されているとすると、App/views/page/user/index.tplが使用されます。
アウトプットハンドラを省略したときは継承元のBEAR_Page::onOutput()に実装されている以下のコードが実行されます。
public function onOutput()
{
$this->display();
}
ページ名 | テンプレートパス |
---|---|
Page_Index |
App/views/page/index.tpl |
Page_User_Profile |
App/views/page/user/profile.tpl |
テンプレートは3種類あります。
ページテンプレート | (App/views/pages/) |
---|---|
レイアウトテンプレート | (App/views/layouts/) |
エレメントテンプレート | (App/views/elements/) |
最低限必要なのはページテンプレートです。ページテンプレートのみが用意されていればそのページテンプレートが全体のHTMLになります。
レイアウトファイルを利用するときはレイアウトテンプレートにページテンプレートの内容が{$content_for_layout}としてアサインされます。※このレイアウト機能は今日の主要フレームワークがほとんど持っているものとほぼ同様のものです。
ページアサインする値でスタティックな値はスタティックバリューとしてページとは別に用意することができます。ページテンプレートの拡張子tplをymlに変えたファイル名にします。
ページ名 | テンプレートパス | スタティックバリュー |
---|---|---|
Page_Index |
App/views/page/index.tpl |
App/views/page/index.yml (またはini) |
携帯アクセスの場合、アサインファイルの中でmobileというセクションが”あれば”defaultセクション(PC)に対して上書きされます。ここでアサインされた値は$layoutという変数でsmartyにアサインされます。
index.yml
default:
body:
color: 青
とアサインされたものはテンプレートでは
index.tpl
ボディカラーは{$layout.body.color}です
となります。
プログラムから動的にアサインファイルの内容を上書きするにはdisplayの時$options['layout']を使います。
// DSi用レイアウトファイルを使用
$options['layout'] = array('layout'=>'index.dsi.tpl');
$this->display(null, $options);
ページクラス内のコードを変更する事なく、UA(ユーザーエージェント)別のテンプレートを用意できます。「リソースセットはページクラスで同一だが携帯でアクセスした場合とPCでアクセスした場合でテンプレートを出し分ける」という事ができます。たとえばPCでindex.tplというページテンプレートが呼び出されるとき、携帯でアクセスして、「もしindex.mobile.tplというファイルが用意されていれば」携帯用テンプレートで出力されます。テンプレートが用意されているかどうかはページは関知しません。
文字コードや絵文字変換はフレームワークが自動的に行なわれます。フォームからサブミットされた文字列も絵文字はエンティティに、文字コードはUTF-8に変換されてページ内で処理できます。通常、ページクラスからユーザーエージェントに応じて文字コードを変換したり、テンプレートを出し分けたりする処理は記述する必要がありません。