FuelPHP Advent Calendar 2011、8日目です。前日は@tao_s さんのFuelPHPとCodeIgniterでCMS作ってパフォーマンスを比べてみたでした。
今日のテーマは「FuelPHP の view に PHPTAL デザインテンプレートを使う」です。
FuelPHP では、ビュー部分は(初期状態では)素の PHP を用います。テンプレートを使いたい、という場合は、packages/parser/classes/view
にあるパーサを利用します。パーサは、dwoo, haml, jade, markdown, mustache, smarty, twig が用意されています。
ん?phptal は無いですね。
無ければ作る (オープンソースの醍醐味)
ということで、PHPTAL デザインテンプレートを使うためパーサを作成しました。
class View_Phptal extends View { protected static $_parser; protected function process_file($file_override = false) { $file = $file_override ?: $this->file_name; try { $parser = static::parser(); foreach($this->get_data() as $key => $value) { $parser->set($key,$value); } $parser->setTemplate($file); return $parser->execute(); } catch (Exception $e) { // Delete the output buffer & re-throw the exception ob_end_clean(); throw $e; } } public $extension = 'phptal'; public static function parser() { if ( ! empty(static::$_parser)) { return static::$_parser; } static::$_parser = new PHPTAL(); static::$_parser->setEncoding(Config::get('parser.View_Phptal.encoding', 'UTF-8')); static::$_parser->setOutputMode(constant(''.Config::get('parser.View_Phptal.output_mode', 'PHPTAL::XHTML'))); static::$_parser->setTemplateRepository(Config::get('parser.View_Phptal.template_repository', '')); static::$_parser->setPhpCodeDestination(Config::get('parser.View_Phptal.cache_dir', APPPATH.'cache'.DS.'PHPTAL'.DS)); static::$_parser->setCacheLifetime(Config::get('parser.View_Phptal.cache_lifetime', 0)); static::$_parser->setForceReparse(Config::get('parser.View_Phptal.encoding', false)); return static::$_parser; } }
既に Smarty 用のパーサがあったので、そちらを参考に作成しました。get_data()
でデータを取ってきて、PHPTAL の set で取り込めば OK です。
setEncoding
等は、packages/parser/config/parser.php
で設定できます。
FuelPHP の開発チームに pull request したので、FuelPHP に取り込まれる可能性がありますが、1.1rc 時点では自分で追加する必要があります。 https://github.com/ounziw/PHPTAL-for-FuelPHP からダウンロードできます。
使い方
phptal.php
をpackages/parser/classes/view/
に追加bootstrap.php
をpackages/parser/
に上書きparser.php
をpackages/parser/config/
に上書き- PHPTAL ライブラリを http://phptal.org/ から取得し、
app/vendor/
に置く app/config/config.php
の ‘always_load’ ‘packages’ に parser を追加する- PHPTAL のキャッシュ機能を使う場合、
app/cache/PHPTAL/
が書込可であることを確認する
後はアプリケーションでビューを呼び出す時、View_Phptal::forge
とすれば(素のビューを使う時は View::forge
)、PHPTAL テンプレートを使用できます。なお、テンプレートファイル名の拡張子は、デフォルトでは .phptal
です。
HTML エスケープ
FuelPHP は、デフォルトで HTML エスケープを行います。PHPTAL も、デフォルトで HTML エスケープを行います。なので、FuelPHP のエスケープ機能をオフにして使います。
app/config/config.php
の auto_filter_output
項目を false
にしてください。
やってみる
試しに、@kenji_s さんのFuelPHP のブログチュートリアルのビューを PHPTAL にしてみました。
元のビューはこんな感じです。
<h2 class="first">Listing Posts</h2> <?php if ($posts): ?> <table cellspacing="0"> <tr> <th>Title</th> <th>Summary</th> <th>Body</th> <th></th> </tr> <?php foreach ($posts as $post): ?> <tr> <td><?php echo $post->title; ?></td> <td><?php echo $post->summary; ?></td> <td><?php echo $post->body; ?></td> <td> <?php echo Html::anchor('posts/view/'.$post->id, 'View'); ?> | <?php echo Html::anchor('posts/edit/'.$post->id, 'Edit'); ?> | <?php echo Html::anchor('posts/delete/'.$post->id, 'Delete', array('onclick' => "return confirm('Are you sure?')")); ?> </td> </tr> <?php endforeach; ?></table> <?php else: ?> <p>No Entries.</p> <?php endif; ?> <br /> <?php echo Html::anchor('posts/create', 'Add new Post'); ?>
これを PHPTAL テンプレートにします。
<h2 class="first">Listing Posts</h2> <table tal:condition="exists:posts" cellspacing="0"> <tr> <th>Title</th> <th>Summary</th> <th>Body</th> <th></th> </tr> <tr tal:repeat="post posts"> <td>${post/title}</td> <td>${post/summary}</td> <td>${post/body}</td> <td> <a tal:replace="structure php:Html::anchor('posts/view/' . post.id,'View')" >View</a> <a tal:replace="structure php:Html::anchor('posts/edit/' . post.id,'Edit')" >Edit</a> <a tal:define="js string:return confirm('Are you sure?')" tal:content="structure php:Html::anchor('posts/delete/' . post.id,'Delete',array('onclick' => js))" >Delete</a> </td> </tr> </table> <p tal:condition="not:posts">No Entries.</p> <br /> <tal:block tal:content="structure php:Html::anchor('posts/create', 'Add new Post')" />
PHPTAL は、テンプレートが XHTML 形式です。このため、テンプレートファイル自体をブラウザでプレビューして確認しやすいです(fuelphp を動かせない環境でも、レイアウト確認できる)。PHPテンプレートエンジンベンチマーク パート2 Smarty vs PHPTAL によると、実行速度は Smarty よりやや劣るらしいです。
明日は @cakephper さんFuelPHPでMongoDBを使う です。
[…] プ文字の働きをします。先日の FuelPHP の view に PHPTAL デザインテンプレートを使う のときに失敗しました。 […]
[…] Related posts:FuelPHP の view に PHPTAL デザインテンプレートを使う […]
[…] 私の書いた記事では、FuelPHP の view に PHPTAL デザインテンプレートを使うについて、変更が予定されています。次の FuelPHP バージョンでは PHPTAL が標準で使用可能になる予定です。「PHPTAL […]
[…] ver1.1 で動かすには、https://ounziw.com/2011/12/08/phptal-fuelphp/ にしたがい、View_Phptal […]