- 1. 概要
- 2. プラグイン関数の作成
- 3. ディレクトリの指定
- 4. いざ作ってみる
1. 概要
テンプレートファイルの中で、「.php」のファイルを読みこんで実行させたかったのです。
「smarty2」では、「{php}{/php}」なり、「{include_php}」なりってのが使えたようですが・・・。今や推奨されていない。
無理やり使う方法は「php - smarty2 から smarty3 へ」へ書きましたが、「smarty」で、テンプレートファイル内で「.php」を実行させるのは、「plugins」を使用すべき(らしい)です。
本項は、下記のサイトを参考にさせていただきました。
「untitled: [PHP]Smarty3.1に バージョンアップして困ったこと その3」
「Chapter 16. プラグインによる Smarty の拡張 | Smarty」
2. プラグイン関数の作成
もともと、「smarty3」には「plugins」が用意されていて。
デフォルトは、 SMARTY_DIR 直下の plugins/ に用意されています。
「FreeBSD 11.3 RELEASE」「smarty3-php72」の場合、「/usr/local/share/smarty3-php72/plugins/」になります。
ファイル名、関数名には、決まりがあって・・・。
ファイル名は
type.name.php
タイプ.名称.php
ですな。
この中に書く、関数名は
smarty_type_name
smarty_タイプ_名称
となります。
3. ディレクトリの指定・・・
自前でプラグイン関数を作成する場合、さすがに「/usr/local/share/smarty3-php72/plugins/」内に、関数は書きたくないですね。
これは、「smarty」の「plugins_dir」というのをいじるのですが・・・。
これに関する記述が古いのばっかりで、やれ「$smarty->plugins_dir[] = パス」だ、やれ「$smarty->plugins_dir = array('plugins', 'パス',);」だのと書いてありますが、実行するとエラーになる。
しかも、設定している箇所じゃなくて、呼び出しているときに「Call to undefined function」てなことになってわけわかんない。
参考サイトを読むことによって、やっと解決しました。
プラグイン関数を置くディレクトリをいちから書くには(もともと用意してあるのをご破算にするわけで、こっちはあんまり使わない)
$smarty->setPluginsDir
(
array
(
$smarty->plugins_dir[0],
'パス1',
'パス2',
)
);
現在の設定に追加するには(こっちを使う方がいいとわたしは思う)
$smarty->addPluginsDir
(
array
(
'パス1',
'パス2',
)
);
注意すべきは、パスの定義は、「php.ini」の「include_path」や set_include_path() 関数で定義した内容は、反映されないようです。
絶対パス、もしくは、実行している「.php」ファイルからの相対パスでないと有効でないようです。
4. いざ作ってみる
ディレクトリの構成を
呼び出し元 | | /usr/hogehoge |
プラグインの置き場所 | | /usr/hogehoge/plugins |
テンプレートの置き場所 | | /usr/hogehoge/templates |
とします。
テンプレート関数を、下記のファイル名で作成して
/usr/hogehoge/plugins/function.sample.php
下記のように記述します。
<?php
/**
* テンプレート関数プラグインのサンプル
* @param unknown $params テンプレートからの引数
* @param unknown $smarty smarty
*/
function smarty_function_sample($params, $smarty)
{
if (empty($params['var']))
{
trigger_error("assign: パラメータ 'var' がありません");
return;
}
return $params['var'];
}
?>
テンプレートファイルを、下記のファイル名で作成して
/usr/hogehoge/templates/sample.tpl
下記のように記述します。
<!DOCTYPE html>
<html>
<head>
<title>サンプル</title>
</head>
<body>
<br>{sample var='ばりばり'}<br>
</body>
</html>
呼び出し元のファイルを、下記のファイル名で作成して
/usr/hogehoge/index.php
下記のように記述します。
<?php
require_once('./smarty/mySmarty.php');
$smarty = new MySmarty(); // Smartyのインスタンスを作成
$smarty->caching = false; // キャッシュしない
$smarty->addPluginsDir(array('/usr/hogehoge/plugins')); // plugins を追加
$template = 'sample.tpl'; // テンプレート設定
$smarty->display($template); // テンプレートを指定し表示
?>
呼び出し元ファイルで「require_once」している、「./smarty/mySmarty.php」ファイルは、下記のように記述します。
<?php
// 抽象クラス読込
require_once('Smarty.class.php');
/**
* smartyクラス
* @author hogehoge
*
*/
class mySmarty extends Smarty
{
/**
* コンストラクタ
*/
public function __construct ()
{
parent::__construct();
$this->template_dir = 'テンプレートディレクトリパス';
$this->compile_dir = 'テンプレートディレクトリキャッシュパス';
$this->config_dir = 'コンフィグレーションディレクトリパス';
$this->cache_dir = 'キャッシュパス';
}
/**
* デストラクタ
*/
public function __destruct ()
{
}
}
?>
|