k-holyのPHPとか諸々メモ

Webで働くk-holyがPHP(スクリプト言語)とか諸々のことをメモしていきます。ソースコードはだいたいWindowsで動かしてます。

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');

動作サンプル