読者です 読者をやめる 読者になる 読者になる

Smartyのプラグイン関数

PHP

僕がSmartyに触りだしたのはEthnaを使い始めてからなので、Smarty歴は1年未満と(その前は主にHTML_Template_Sigma, HTML_Template_Flexyを使っていました)、非常に短いのですが、最近Smartyも結構使えるんだなというのを実感しています。
Smartyについて知らなかったことはいろいろあって、例えば、Smartyにプラグイン関数を追加するときには、$smarty->register_XXXメソッドを使って手動で関数を登録しないといけないんだと思い込んでいました。原因は、Ethnaが生成するコントローラオブジェクトのコード内にある、「ここにユーザ定義のsmarty XXX一覧を記述してください」という、実に親切なコメントです。


実際には、

$smarty->plugins_dir = array('plugins', 'my_plugins');

のように、plugins_dir属性を設定してやれば、Smartyプラグインの命名規則に乗っ取ったファイルがインクルードされ、自動的に関数が登録されるのですね。
Ethnaの場合は、コントローラオブジェクトのインスタンス変数$directoryの"plugins"を設定すればよい、ということも初めて知りました。
とはいえ、よく使う関数であれば、Smartyがプラグイン・ディレクトリを探すオーバーヘッドを省ける分、手動で登録するメリットもありそうですが。


ということは、Piece Frameworkでも、次のような独自レンダラを定義して、

<?php
require_once 'Pice/Unity/Plugin/Rederer/Smarty.php';

class Pice_Unity_Plugin_Renderer_MySmarty
    extends Piece_Unity_Plugin_Renderer_Smarty
{
    var $_smartyClassVariables
            = array('template_dir' => null,
                    'compile_dir'  => null,
                    'config_dir'   => null,
                    'cache_dir'    => null,
                    'plugins_dir'  => null);
}
?>

設定ファイル(piece-untify-config.php)の中で、

- name: View
  point:
    - name: renderer
      type: extension
      value: Renderer_MySmarty
- name: Renderer_MySmarty
  point:
    - name: template_dir
      type: configuration
      value: ../templates/
    - name: compile_dir
      type: configuration
      value: ../templates_c/
    - name: cache_dir
      type: configuration
      value: ../cache
    - name: plugins_dir  # ユーザ定義プラグインの配置ディレクトリ
      type: configuration
      value:
          - plugins
          - ../templates/plugins

のように設定すれば、任意のディレクトリにSmartyプラグインを配置できるわけですか。無知ゆえに、かなり時間を損しました。


plugins_dirの他にも、キャッシュ関連の属性(cache_handler_funcとか)もいろいろあって、Piece Frameworkの中で、どこまでカスタマイズする手段を提供していくのか、という難しさを感じました。Smarty侮りがたし。


ここまで書いて、ふと気になってMapleのコードを眺めてみましたが、Smarty4Mapleの中ではplugins_dirは定義していないようですね。どうやって、プラグイン・ディレクトリを追加するのかなぁ。(maple.ini内で?)