Smarty のプラグイン小ネタ集

Smartyプラグインの追加はちょっとした関数を書いて Smarty の plugins フォルダに入れるだけ。あると便利なちょっとしたプラグイン。私の場合。Smarty のデリミタを {{ と }} に変更しているので「使い方」の部分のソースは適切に変更して下さい。

modifier.mbtruncate.php

truncate をマルチバイト文字列に対応。

使い方
{{$string|mbtruncate:80}}
ソース
<?php
function smarty_modifier_mbtruncate($string, $length = 80, $etc = '...')
{
    if ($length == 0) { return '';}
    if (strlen($string) > $length) {
        $length -= strlen($etc);
        return mb_strcut($string, 0, $length).$etc;
    } else {
        return $string;
    }
}
?>

modifier.mbconvert.php

マルチバイト文字コード変換。

使い方
{{$string|mbconvert:'urf-8':'euc-jp'}}
ソース
<?php
function smarty_modifier_mbconvert($string, $charset, $source_charset = 'auto')
{
    return mb_convert_encoding($string, $charset, $source_charset);
}
?>

modifier.mbkana.php

全角半角変換。

使い方
{{$string|mbkana}}
ソース
<?php
function smarty_modifier_mbkana($string, $option = 'KV')
{
    return mb_convert_kana($string, $option);
}
?>

compiler.append.php

変数を配列に追加。assign では配列を扱えないので。

使い方
{{* prepare the array *}}
{{append var='arr' value=$var1}}
{{append var='arr' value=$var2}}
{{append var='arr' value=$var3}}

html_table と一緒にこんな感じでも使える。

{{foreach from=$list key='key' item='val' name='listLoop'}}
{{capture name='row'}}
<h4><a href="{{$val.URL}}">{{$val.name}}</a></h4>
<p>{{$val.text}}</p>
{{/capture}}
{{append var='colAry' value=$smarty.capture.row}}
{{/foreach}}
{{html_table loop=$colAry cols=2 table_attr='class="table"'}}

同一テンプレート内で何回か使用する際は変数の初期化を忘れずに。

{{php}}$this->clear_assign('calAry');{{/php}}
ソース
<?php
function smarty_compiler_append($tag_attrs, &$compiler)
{
    $_params = $compiler->_parse_attrs($tag_attrs);
    if (!isset($_params['var'])) {
        $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING);
        return;
    }
    if (!isset($_params['value'])) {
        $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING);
        return;
    }
    return "\$this->append({$_params['var']}, {$_params['value']});";
}
?>

modifier.urllink.php

テキスト内に URL が含まれている場合に aタグで囲む。

使い方
{{$text|escape|urllink}}
{{$text|escape|urllink:"_blank"}}
ソース
<?php
function smarty_modifier_urllink($value, $target = null)
{
    $options = '';
    if (!empty($target)) {
        $options = sprintf(" target=\"%s\"", $target);
    }
    $value = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\"" . $options . ">\\0</a>", $value);
    return $value;
}