FuelPHPでSmartyに動的プラグインを仕込む

FuelPHPでSmartyを使い
SmartyのregisterPlugin関数を使う際のメモ

FuelPHPでSmartyを使う場合
FuelPHP1.7.3のテンプレートエンジンにsmartyを設定
こちらのサイトを参考にしてください。

やりたい事は、
テンプレート内で

{less file="style"}

こんな関数を使いたい。

どんな処理をしたいかというと
LESSを自動的にコンパイルし、コンパイルされたcssのパスを表示したい

/app/classes/controller/index.php

class Controller_Index extends \Controller
{
  public function action_index(){
    $view = \View_Smarty::forge('index');
    return $view;
  }
}

/app/views/index.tpl

{less file="style"}

まず、この状態では、エラーになる。
lessなんて関数はSmartyにはないから当たり前。

なので、Controller側でSmartyに関数を登録します。

/app/classes/controller/index.php

class Controller_Index extends \Controller
{
  public function action_index()
  {
    \View_Smarty::parser()->registerPlugin('function', 'less', array($this,'smarty_function_less')); //←追記
    $view = \View_Smarty::forge('index');
    return $view;
  }

// ↓追記
  public function smarty_function_less($params, $smarty)
  {
    $file = $params['file'];
    if( !preg_match('/\.less$/',$file ) )
    {
      $file .= '.less';
    }
    return \Asset::less($file);
  }

}

\View_Smarty::parser()->registerPlugin('function', 'less', array($this,'smarty_function_less'));

\View_Smartyからparser()関数でSmartyのクラスを取得します。
staticなクラスが獲得できるので、これに対してregisterPlugin()すれば
恒久的に関数を登録できます。

lessというfunctionを登録し、
実際に処理されるのは、$thisのsmarty_function_lessという関数

$file = $params['file'];
if( !preg_match('/\.less$/',$file ) )
{
$file .= '.less';
}

拡張子が無かったら補完してあげる。

return \Asset::less($file);

LESSをコンパイルしてパスを返す

実行すると、

{less file="style"}

が、

<link type="text/css" rel="stylesheet" href="/assets/ccss/style.css?1523197338" />

こんな感じで変換されます。

LESSを使うための解説は
CentOS7でFuelPHPでlessを使う
を参考にして下さい。

rugoh-wordpress