以前紹介したこちらのmustacheのphp実装ではsmartyやtwigで使えるパイプ記法のフィルターが使えます。今回はこのパイプ記法について紹介します。
※mustacheには本来ない機能ですので、テンプレートを他の言語でも使いたいという場合には注意が必要です。
実例
例えば、フィルターを使ってゼロパッディングとゼロサプレスを行うには以下のようにします。テンプレートに{{%FILTERS}}pragmaを入れることでフィルタ記法を解釈するようになります。
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php require_once(dirname(__FILE__).'/../vendor/autoload.php'); $m = new Mustache_Engine(array( 'loader' => new Mustache_Loader_FilesystemLoader(dirname(__FILE__).'/../views'), 'partials_loader' => new Mustache_Loader_FilesystemLoader(dirname(__FILE__).'/../views/partials'), 'escape' => function($v) { return htmlspecialchars($v, ENT_QUOTES, 'UTF-8'); }, )); $m->addHelper('zero', array( 'padding' => function($v) { return sprintf('%04d', $v); }, 'suppress' => function($v) { return preg_replace('/^0+/', '', $v); })); $v = array( 'code1' => '1', 'code2' => '0001', ); $tpl = $m->loadTemplate('index'); echo $tpl->render($v); ?> |
mustache template
1 2 3 4 5 6 7 8 9 10 11 12 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>mustache</title> </head> <body> {{%FILTERS}} <p>{{code1|zero.padding}}</p> <p>{{code1|zero.suppress}}</p> </body> </html> |
注意!
mustache準拠のlambdaを使えば同じことができるように思えますが、lambdaでは変数の展開が行われる前に関数に”{{変数}}”が文字列として渡ってしまうためエラーや想定外の結果となることがあります。いつ展開が行われるか、注意が必要です。
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php require_once(dirname(__FILE__).'/../vendor/autoload.php'); $m = new Mustache_Engine(array( 'loader' => new Mustache_Loader_FilesystemLoader(dirname(__FILE__).'/../views'), 'partials_loader' => new Mustache_Loader_FilesystemLoader(dirname(__FILE__).'/../views/partials'), 'escape' => function($v) { return htmlspecialchars($v, ENT_QUOTES, 'UTF-8'); }, )); $v = array( 'code' => '1', 'zeropadding' => function($v) { return sprintf('%04d', $v); }, ); $tpl = $m->loadTemplate('index'); echo $tpl->render($v); ?> |
mustache template
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>mustache</title> </head> <body> <p>{{#zeropadding}}{{code}}{{/zeropadding}}</p> </body> </html> |
展開結果
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>mustache</title> </head> <body> <p>0000</p> <!--// 0001ではない! --> </body> </html> |