第10回 Smartyの便利な機能を使いこなす(その4:プラグイン編) - Smarty講座

PHP講座 HTML×CSS 初級編

yossy先生のSmarty講座

Lecutures on PHP

第10回 Smartyの便利な機能を使いこなす(その4:プラグイン編) (その1)

 このエントリーをはてなブックマークに追加

yossy先生
今回はプラグインについて説明します。

前回説明したフィルタは、Smartyがテンプレートファイルを解析してPHPのコードに変換し、それを実行して出力するという、Smarty内部で行われる一連の処理の流れを拡張して処理途中のテンプレートやPHPを書き換えたり追記したりすることが出来る仕組みでした。

そして今回説明するプラグインもSmartyの動作や機能を拡張するための仕組みです。

プラグインって何?

ではその「プラグイン」という言葉を耳にしたことはあるでしょうか?
プラグインとは、元のプログラムに対して機能を後から追加したり拡張するための小さなプログラムのことです。

身近なところでは、WebブラウザがFlashや動画などを見られるようにするためのプレイヤーもプラグインの一種ですし、ブログのサイドメニューに追加できるブログパーツもプラグインの一種といえるでしょう。

Smartyのプラグインも同様に、テンプレートで利用できる関数や修飾子を追加したり拡張することが出来ます。
またPHPのコードが理解できれば、自分で簡単にSmartyプラグインを作ることも出来ます。

今回はプラグインの説明をしつつ、実際に自分で作ってみるところまで説明してみたいと思います。

Smartyのプラグインの種類

さてSmartyで作ることの出来るプラグインは、以下の9種類に分類することが出来ます。

  • テンプレート関数プラグイン
  • 修飾子プラグイン
  • ブロック関数プラグイン
  • コンパイラ関数プラグイン
  • プリフィルタプラグイン
  • ポストフィルタプラグイン
  • アウトプットフィルタプラグイン
  • リソースプラグイン
  • インサートプラグイン

yossy先生
随分と種類が多いと思われるかもしれませんが、Smartyが持つほとんどすべての機能がプラグインにより拡張可能であるためです。

テンプレート関数や修飾子といった基本的なものから、前回説明したフィルタや前々回のキャッシュの時に説明した{insert}で呼び出されるPHP関数もプラグインとして拡張することが可能です。

プラグインファイル

プラグインは1つのPHPファイルで作られます。そしてファイル名には以下のような命名規則があります。

[type].[name].php

[type]はプラグインの種類を表します。前述の9種類のプラグインそれぞれに対応する名前が割り当てられています。

  • テンプレート関数プラグイン …… function
  • 修飾子プラグイン …… modifier
  • ブロック関数プラグイン …… block
  • コンパイラ関数プラグイン …… compiler
  • プリフィルタプラグイン …… prefilter
  • ポストフィルタプラグイン …… postfilter
  • アウトプットフィルタプラグイン …… outputfilter
  • リソースプラグイン …… resource
  • インサートプラグイン …… insert

そして[name]がプラグインの名前です。

例えば{hogehoge}というテンプレート関数をプラグインで作成しようとした場合、ファイル名はfunction.hogehoge.phpとなります。

そしてそのファイル内で定義するPHP関数名にも命名規則があります。

function smarty_[type]_[name]()

例えば{hogehoge}というテンプレート関数をプラグインで作成しようとした場合、PHP関数名はsmarty_function_hogehoge()となります。

プラグインディレクトリ

yossy先生さて、このプラグインファイルはどこに置いたらいいでしょう?

デフォルトでは、SMARTY_DIRで定義したディレクトリの下にあるpluginsというディレクトリがプラグインを置くためのディレクトリになります。

例えばSMARTY_DIRが/usr/local/lib/Smarty-2.6.22/libs/ の場合、/usr/local/lib/Smarty-2.6.22/libs/plugins/ がプラグインディレクトリになります。

ではこのディレクトリの中をlsコマンドなどで見てみましょう。

block.textformat.php            function.html_table.php         modifier.indent.php
compiler.assign.php             function.mailto.php             modifier.lower.php
function.assign_debug_info.php  function.math.php               modifier.nl2br.php
function.config_load.php        function.popup.php              modifier.regex_replace.php
function.counter.php            function.popup_init.php         modifier.replace.php
function.cycle.php              modifier.capitalize.php         modifier.spacify.php
function.debug.php              modifier.cat.php                modifier.string_format.php
function.eval.php               modifier.count_characters.php   modifier.strip.php
function.fetch.php              modifier.count_paragraphs.php   modifier.strip_tags.php
function.html_checkboxes.php    modifier.count_sentences.php    modifier.truncate.php
function.html_image.php         modifier.count_words.php        modifier.upper.php
function.html_options.php       modifier.date_format.php        modifier.wordwrap.php
function.html_radios.php        modifier.debug_print_var.php    outputfilter.trimwhitespace.php
function.html_select_date.php   modifier.default.php            shared.escape_special_chars.php
function.html_select_time.php   modifier.escape.php             shared.make_timestamp.php

……なにやら、多くのファイルが格納されていますね。

第4回でSmartyの関数には「組み込み関数」と「カスタム関数」の2種類があるというお話をしたのを覚えてますか?

その時に「カスタム関数」はプラグイン形式で用意された関数という説明をしましたが、その「カスタム関数」を定義しているプラグインファイルがここに格納されています。

デフォルトで用意されているプラグインファイルと一緒に自作のプラグインファイルもこのディレクトリに配置することで、カスタム関数と同様に扱うことが出来るようになります。

ただ、自作のプラグインファイルを、これら標準で用意されたプラグインファイルと一緒のディレクトリに置いてもいいのですが、やはり自分で作ったファイルは分けて管理したいと思いますよね?

そこで、デフォルトのプラグインディレクトリに加えて新たにプラグインディレクトリを追加する方法を説明したいと思います。

Smartyには$plugins_dirというインスタンス変数があります。この変数はプラグインを検索するパスを配列で格納します。

例えば、自作のプラグインファイルは/var/www/smarty/pluginsというディレクトリで管理したいと思った場合、以下のように$plugins_dirの配列要素としてパスの文字列を追加することで、プラグインディレクトリを増やすことが出来ます。

$smarty->plugins_dir[] = '/var/www/smarty/plugins';

なおプラグインディレクトリに置かれたプラグインは自動的に読み込まれます。

動的にプラグインを登録する

yossy先生そしてもう一つ、プラグインを利用する方法があります。

この方法ではプラグインディレクトリにわざわざファイルを置かず、必要なときに動的にプラグイン関数を使えるようにすることもできます。

前回、フィルタ関数の作成方法を説明しましたが、その時にregister_*****filter()というメソッドを紹介しました。

実はこのregister_*****()というメソッド、フィルタだけではないんです。プラグインを作ることが出来る9種類のうち、インサートプラグイン以外の8種類に対応したメソッドが用意されています。

  • テンプレート関数プラグイン …… register_function
  • 修飾子プラグイン …… register_modifier
  • ブロック関数プラグイン …… register_block
  • コンパイラ関数プラグイン …… register_compiler_function
  • プリフィルタプラグイン …… register_prefilter
  • ポストフィルタプラグイン …… register_postfilter
  • アウトプットフィルタプラグイン …… register_outputfilter
  • リソースプラグイン …… register_resource

前回説明したフィルタの仕組みも、実はプラグインの一種だと言えるのかも知れませんね。

  • 1
  • 2

  



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)