やたーーSmartyでTTのWRAPPERエミュレーションができたよーー

きっと誰かが既に作っているであろうということは置いておいて。。。

<?php
/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */

/**
 * Smarty {wrapper}{/wrapper} block plugin
 *
 * Type:     block function<br>
 * Name:     wrapper<br>
 * Purpose:  TT WRAPPER emulation.
 * @author Hisashi Satake
 * @param array parameter
 *  - template ... reserved. template file path.
 * @param string contents of the block
 * @param Smarty clever simulation of a method
 * @return string string $content re-formatted
 */
function smarty_block_wrapper($params, $content, &$smarty)
{
    $template = $params['template'];
    unset($params['template']);

    foreach ($params as $key => $value) {
        $smarty->assign($key, $value);
    }

    $smarty->assign('content', $content);
    return $smarty->fetch($template);
}

/* vim: set expandtab: */

?>

perlTemplate Toolkit、WRAPPERのエミュレーションです。WRAPPERなんですが、TT使ってたときに重宝してて、Smartyでも似たようなことできないのかなあ、と思ったんだが、マニュアルに似たようなのが書いてなくて、そのうち、探すのがめんどくさくなったので即席で作ってみますた。

wrapper.tpl(ファイル名はテキトーでかまわん。ラッパー側のテンプレ)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
</head>
<body>

<h1>[% $header %]</h1>

[% $content %]

</body>
</html>

content.tplでこんな風にwrapperで囲んでやる。

[% wrapper template="wrapper.tpl" header="test header" %]
wrapper test
[% /wrapper %]

で、出来上がるのはこんなHTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
</head>
<body>

<h1>test header</h1>
wrapper test

</body>
</html>

※パラメータはtemplateだけが予約されてて、ラッパー側のテンプレートパスになります。

車輪の再発明大好き!ちなみに、例ではデリミタはTT風味にしてあります。{}だとSmartySJISでコケるから。

追記(07.06.18)
ウノウの中の人が同様のネタをやってたのでトラックバックしてみる。十人十色とはよく言ったもので、各々アプローチが違うのが面白い。

参考→http://www.hakoniwa.net/tt/#WRAPPER