HTML - smarty - include しないで plugins

 クラウディア
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 ()
    {
    }
}
?>
ハイスピードプランマイニングベース【usus ウズウズ】