イベント駆動型PHPフレームワークを作る その15

SmartyのプラグインをSimgに取り込もう。

ファイルシステムから自動的に取り込むのが簡単そうだが、これだと1プラグイン 1ファイルとなるので、なんだかごちゃごちゃしそうだ。
SimgではregisterPluginで登録しよう。
まずはディレクトリだ。
プラグインを定義するPHPファイルの格納場所を規定する。
分類としてはビューだろう。

application/view/plugin

ここにPHPファイルを配備し、プラグイン本体となる関数を記述する。
プラグイン関数の命名規約は以下だ。
これはSimgの規定である。
(PHPファイル名はconfigで指定するので自由。)

function (プラグインタイプ)_(プラグイン名)

Simg対応のプラグインタイプは、今のところ以下だ。

  • function
  • block
  • compiler
  • modifier

PHPファイルには複数のプラグイン関数を記述できる。

さて、このあたりの情報をSimgに伝える必要がある。
Simgではapplication/configに記述するのが決まりだ。
configファイル名は

plugin.ini

とする。
内容は以下の通り。

[prefix]
plugin=PLUGIN_
parameter=PP_
[plugin]
SAMPLE=samp_: psample: fupper, bupper, cmecho, capitalize, truncate
[parameter]
TEXT=text

これはデモのplugin.iniだ。
定義内容を以下に示す。

定数名 補足
PLUGIN_SAMPLE samp_: psample plugin接頭辞: samp_
pluginファイル名: psample.php
PP_TEXT text プラグインの引数名

Simg対応のプラグインは4種類だから、定義可能な関数は以下の組合せとなる。
定義しなければ無視されるので、必要なタイプのものだけを定義しよう。

プラグインタイプ 関数名
関数 function_fupper
function_bupper
function_cmecho
function_capitalize
function_truncate
修飾子 modifier_fupper
modifier_bupper
modifier_cmecho
modifier_capitalize
modifier_truncate
ブロック block_fupper
block_bupper
block_cmecho
block_capitalize
block_truncate
コンパイラ compiler_fupper
compiler_bupper
compiler_cmecho
compiler_capitalize
compiler_truncate

実際の内容(psample.php)を見てみよう。

function function_fupper($params, &$smarty) {
  return strtoupper($params[PP_TEXT]);
}
function modifier_truncate($string, $length = 80, $etc = '...') {
  $ret = '';
  if($length > 0) {
    if(strlen($string) > $length) {
      $length -= strlen($etc);
      $ret = substr($string, 0, $length + 1) . $etc;
    } else {
      $ret = $string;
    }
  }
  return $ret;
}
function block_bupper($params, $content, &$smarty, &$repeat) {
  if(!$repeat) {
    return strtoupper($content);
  }
}
function compiler_cmecho($tag_arg, &$smarty) {
  return '';
}

関数型の「fupper」、修飾子型の「truncate」、ブロック型の「bupper」、コンパイラ型の「cmecho」が定義されている。

このプラグインを有効にするにはrenderで、$output->activePlaginをコールする。
引数がarrayなのはプラグインを複数有効にできるからだ。

public function rendering($event, $output, $parameter, $db) {
  if($output->hasPartial(PARTIAL_BASE)) {
    $output->activePlagin(array(PLUGIN_SAMPLE));
    /* 
     * 省略
     */
  }
}

以上でプラグインが利用できる。

<{samp_fupper text='simple is great'}>
<{samp_bupper}> bridge over troubled water <{/samp_bupper}>
<{"When you're weary feelin' small, When tears are in your eyes"| samp_truncate:40:'...'}>
<{samp_cmecho text='Copyright 2015 SysCon All rights reserved.'}>

プラグインを使うことでテンプレートの構造化プログラミングが可能になる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です