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; }