具体的なプレースホルダ
この他に、いくつかのプレースホルダのサブクラスが提供されています。これらは情報を保持するだけではなく、出力する際に保持している情報に特別な加工を行います。
プレースホルダ名 | 説明 |
Doctype | ドキュメントの種類('XHTML1_STRICT'等)を保持するためのプレースホルダ。 |
HeadTitle | ドキュメントのタイトルを保持するためのプレースホルダ。 |
HeadLink | ドキュメントのヘッダーのLINK要素を保持するためのプレースホルダ。 |
HeadMeta | ドキュメントのヘッダーのMETA要素を保持するためのプレースホルダ。 |
HeadScript | ドキュメントのヘッダーに設置したスクリプトを保持するためのプレースホルダ。 |
HeadStyle | ドキュメントのヘッダーのSTYLE要素を保持するためのプレースホルダ。 |
InlineScript | ドキュメントの中に埋め込まれたスクリプトを保持するためのプレースホルダ。 |
JSON | JSON形式で出力したい情報を保持するためのプレースホルダ。 |
Translate | 言語間の単語の対応を保持するためのプレースホルダ。 |
これらについての例を見ていきましょう。サンプルではコントローラスクリプトで設定したプレースホルダをスクリプトで使っています。
まずヘッダまわりのものを見てみましょう。ここではheadTitleプレースホルダ、HeadScriptプレースホルダ、InlineScriptプレースホルダを利用しています。
IndexController.php内: class IndexController extends Zend_Controller_Action { public function init() { ... //タイトルの先頭に加える(1) $this->view->headTitle('Zend_View: ', 'PREPEND'); ... //スクリプトの設定(2) $this->view->HeadScript()->appendFile('/js/currenttime.js'); $this->view->InlineScript() ->appendScript('setInterval("updateTime()", 1000);'); index.phtml 内: <?php $this->placeHolder('title')->set('簡単なメモ');//(3) echo $this->Doctype('XHTML1_STRICT'); //(4) //echo $this->Doctype('HTML4_LOOSE'); ?> <html> <head> <?php echo $this->headTitle($this->placeHolder('title')); ?> <?php echo $this->HeadScript(); //(5) ?> </head> <body> <h1><?php echo $this->placeHolder('title') ?></h1> ... <h3>上の内容をHTMLにしたもの</h3> <?php echo $this->preHelper($this->placeHolder('memosList')) ?> <?php echo $this->InlineScript(); //(6) ?>
HeadTitle
HeadTitleはhtmlヘッダの中にあるtitleタグを出力するためのプレースホルダです。HeadTitleではタイトルの前と後に表示する文字列を追加することができます。記法はview->headTitle(加える内容, 加える位置)で、加える位置を省略可能するとタイトルの後に追加されます。例の(1)のように、'PREPEND'というキーワードを利用すると、タイトルの先頭に追加できます。図の(3)ではタイトルの内容を加えた上で表示を行っています。
HeadScript、InlineScript
HeadScript、InlineScriptは(JavaScriptなどの)スクリプトを格納するためのプレースホルダです。HeadScriptはHTMLのヘッダ内で宣言するスクリプト、InlineScriptはHTMLの内部で宣言するためのプレースホルダです。図の(2)にあるとおり、スクリプトをファイルから読み込むように設定する(appendFileメソッド)こともできますし、直接スクリプトの内容を文字列で指定して追加する(appendScriptメソッド)こともできます。
どのように指定したスクリプトであっても図の(5)や(6)のように、通常のプレースホルダと同じように出力できます。
Doctype
Doctypeはドキュメントのタイプを宣言するためのスクリプトです。図の(4)のように、スクリプトの先頭で呼び出して利用するのが普通です。Doctypeには次の種類を指定できます。
XHTML1_STRICT, XHTML1_TRANSITIONAL, XHTML1_FRAMESET, HTML4_STRICT, HTML4_LOOSE, HTML4_FRAMESET
実は、Doctypeの内容により他のビューヘルパの挙動も変化します。1番分かりやすいのはDoctypeに指定されているのがXHTMLなのかHTMLなのかによる違いで、formTextなどの出力が変化します。また、自分の書いたスクリプトでXHTMLかどうか調べるにはDoctypeのisXhtmlメソッドを利用します。
class Zend_View_Helper_BrTag { ... public function brTag() { $xhtml = "<br />\n"; if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { //XHTMLかどうか調べている ... } }
translate
translateプレースホルダは、Zend_Translateを利用して、言語設定に応じて出力を変化させるためのプレースホルダです。利用方法はいくつかありますが、あらかじめZend_Translateのインスタンスを登録しておく使い方が奨励されています。
IndexController.php内: //言葉の置き換え $adapter = new Zend_Translate('array', array('submit' => '送信', 'reset' => '全て消す'), 'ja'); Zend_Registry::set('Zend_Translate', $adapter); inputForm.phtml内: echo $this->formSubmit('', $this->translate('submit'));
このように、translateプレースホルダを経由すると、あらかじめZend_Translateに登録されてる単語が置換されます。
JSON
JSON形式でデータをやりとりする場合には、通常のデータのやりとりと、いくつか異なる点があります。
- 通常の描画を行ってはならない
- HTTPのヘッダで指定するドキュメントタイプが異なる
jsonプレースホルダを利用すれば上の処理を自動的に行ってくれます。
<?php //json_encode は UTF-8 しか受け付けないので変換する $dateTimeMemosUTF8 = array(); foreach ($this->dateTimeMemos as $dateTimeMemo) { foreach ($dateTimeMemo as $dateTime => $memo) { $key = mb_convert_encoding($dateTime, "UTF-8", "SJIS"); $value = mb_convert_encoding($memo, "UTF-8", "SJIS"); $dateTimeMemosUTF8[$key] = $value; } } //あとは JSONプレースホルダに渡すだけ echo $this->json($dateTimeMemosUTF8);
なお、JSON形式に実際に変換しているのはPHPのjson_encode関数です。この関数はUTF-8でエンコードしたデータのみを受けつけるので、上の例ではmb_convert_encoding関数を利用して変換を行っています。
今回のまとめ
今回は標準的なビューヘルパについて説明しました。次回は引き続き、ビューヘルパーを自作する方法、および、Zend FrameworkとSmartyを連携させる方法についての説明を行います。