3つのテンプレートエンジンを共通のインタフェースで利用するためのライブラリ Volcanus_TemplateRenderer
Smarty3, PHPTAL, Twigを共通のインタフェースで利用するためのライブラリ Volcanus_TemplateRenderer を公開しました。
既存のフレームワークを使ってる大多数の人には何の役にも立たない、誰得なライブラリですが…。
Packagistに登録済みなので、composerでインストールできます。
composer.json
{ "require": { "php": ">=5.3", "smarty/smarty": "dev-trunk", "twig/twig": "dev-master", "phptal/phptal": "dev-master", "volcanus/template-renderer": "dev-master" } }
Smarty
対応バージョンは Smarty3 です。何かとレガシー呼ばわりされるSmartyですが、それにしても今時 Smarty2 はないですよね?
<?php include '/path/to/vendor/autoload.php'; use Volcanus\TemplateRenderer\Renderer; use Volcanus\TemplateRenderer\Adapter\SmartyAdapter; // Smarty $renderer = new Renderer(new SmartyAdapter(new \Smarty(), array( 'template_dir' => __DIR__, 'compile_dir' => sys_get_temp_dir(), ))); $renderer->assign('suffix', '様'); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html', <<<'TEMPLATE' <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>{$name}</title> </head> <body> <h1>Hello {$name}{$suffix} !!</h1> </body> </html> TEMPLATE ); $renderer->render('hello.html', array('name' => 'Smarty')); // Hello Smarty様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html');
Twig
対応バージョンは…分かりませんごめんなさい!
1.12 で確認してますが、複雑な機能には対応していませんので、多分大抵は動くんじゃないかと…。
<?php include '/path/to/vendor/autoload.php'; use Volcanus\TemplateRenderer\Renderer; use Volcanus\TemplateRenderer\Adapter\TwigAdapter; // Twig $renderer = new Renderer(new TwigAdapter(new \Twig_Environment(), array( 'path' => __DIR__, ))); $renderer->assign('suffix', '様'); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html', <<<'TEMPLATE' <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>{{name}}</title> </head> <body> <h1>Hello {{name}}{{suffix}} !!</h1> </body> </html> TEMPLATE ); $renderer->render('hello.html', array('name' => 'Twig')); // Hello Twig様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html');
PHPTAL
対応バージョンは…ごめんなさい…。
1.2.2 で確認してますが、多分大抵は動くんじゃないかと…。
<?php include '/path/to/vendor/autoload.php'; use Volcanus\TemplateRenderer\Renderer; use Volcanus\TemplateRenderer\Adapter\PhpTalAdapter; // PHPTAL $renderer = new Renderer(new PhpTalAdapter(new \PHPTAL(), array( 'templateRepository' => __DIR__, 'phpCodeDestination' => sys_get_temp_dir(), ))); $renderer->assign('suffix', '様'); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html', <<<'TEMPLATE' <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title tal:content="name">タイトル</title> </head> <body> <h1>Hello <span tal:replace="name">Anonymous</span><span tal:replace="suffix">氏</span> !!</h1> </body> </html> TEMPLATE ); $renderer->render('hello.html', array('name' => 'PHPTAL')); // Hello PHPTAL様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html');
応用編 (SmartyとTwigの出力結果をPHPTALで出力)
こんな感じでテンプレートエンジンを切り替えながら Renderer::assign() で出力結果を溜めつつ、最後に結合して出力することも可能です。
<?php include '/path/to/vendor/autoload.php'; use Volcanus\TemplateRenderer\Renderer; use Volcanus\TemplateRenderer\Adapter\SmartyAdapter; use Volcanus\TemplateRenderer\Adapter\TwigAdapter; use Volcanus\TemplateRenderer\Adapter\PhpTalAdapter; // Smarty3 $renderer = new Renderer(new SmartyAdapter(new \Smarty(), array( 'template_dir' => __DIR__, 'compile_dir' => sys_get_temp_dir(), ))); $renderer->assign('suffix', '様'); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html', 'Hello {$name}{$suffix} !!'); $renderer->assign('smarty', $renderer->fetch('hello.html', array('name' => 'Smarty'))); // Hello Smarty様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html'); // Twig $renderer->setAdapter(new TwigAdapter(new \Twig_Environment(), array( 'path' => __DIR__, ))); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html', 'Hello {{name}}{{suffix}} !!'); $renderer->assign('twig', $renderer->fetch('hello.html', array('name' => 'Twig'))); // Hello Twig様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html'); // PHPTAL $renderer->setAdapter(new PhpTalAdapter(new \PHPTAL(), array( 'templateRepository' => __DIR__, 'phpCodeDestination' => sys_get_temp_dir(), ))); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html', <<<'TEMPLATE' <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title tal:content="title">タイトル</title> </head> <body> <h1>Hello <span tal:replace="name">Anonymous</span><span tal:replace="suffix">氏</span> !!</h1> <h1 tal:content="smarty">Smartyコンテンツ</h1> <h1 tal:content="twig">Twigコンテンツ</h1> </body> </html> TEMPLATE ); $renderer->render('hello.html', array( 'title' => 'PHPTAL + Smarty + Twig', 'name' => 'PHPTAL', )); unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.html');