テンプレートエンジンとは・・・
phpにはsmartyやswingなどといったテンプレートエンジンというものが存在します。
テンプレートエンジンの役割は、サーバサイドとフロントサイドでの役割を明確化することかなと思います。
今回はsmartyについて話をしていこうと思います。
htmlファイルでは処理を行わず、あくまで表示をするためだけのファイルで、
入力値などの処理などは全てサーバ側で処理をしてその結果の値などをhtmlファイルに渡すことで、
htmlファイルでは値の表示やコンテンツの表示のみに特化させて、役割を明確化することかなと思います。
Web開発では、MVC(model、view、controller)と言われる構成がデファクトスタンダード?となってますが、
このSmartyで、viewとcontrollerを分離することができます。
ちなみにmodelはクラス(オブジェクト)、controllerはプログラムの核となる部分でmodelに値を渡して実行したり、viewに値を渡してページを表示させたりという部分、
viewはhtmlファイルのような表示ファイル(smartyではtplファイル:テンプレートファイル)です。
Smartyのサンプルコード
class CreateSmartyObj{ const SMARTY_APP = 'app'; const SMARTY_TEMPLATE = 'template'; const SMARTY_TEMPLATE_C = 'template_c'; public function __construct(){ $this->smarty = new Smarty(); $this->smarty->template_dir = './templates'; $this->smarty->compile_dir = './template_c'; $this->smarty->cache_dir = './cache'; $this->smarty->config_dir = './configs'; } public function display_template($template_file){ $this->smarty->display($template_file); } public function assign($name_in_template, $variavle){ $this->smarty->assign($name_in_template, $variavle); } } function createSmarty(){ return new CreateSmartyObj(); }
template_dirとは、templateファイルをどこに置くかを指定する。
compile_dirとは、template_cは初めてtemplateファイルを実行すると、そのコンパイルファイルを作成するが、そのファイルをどこに置くかを指定する。自動的にこのディレクトリは作成されるので事前作成は必要ないです。
display_templateメソッドは、表示するテンプレートファイルを引数に指定することで、そのファイルを表示する。
assignメソッドでは、templateファイル内でphpから渡された値を参照する際の、変数名と実際の値を引数に指定して、templateファイルが読み込まれた際に埋め込みます。
役割としてSmarty自身が、表示や値を割り当てる処理をするべきなので、
Smartyクラスの中に上記メソッドたちを定義しています。
Smartyのパラメータ
smartyにはViewとControllerを分ける役割があるので、その機能を存分発揮するためのパラメータが多く存在してます。
主なパラメータについて説明していこうと思います。
パラメータ | 説明 |
---|---|
{assign} | PHPから受け取った変数の値を割り当てる |
{expend} | |
{include file} | 外部のテンプレートファイル(.tpl)を読み込む |
{having} | |
{foreach} | PHPのforeachを実行する |
{section} | PHPのforチックでkey-valueで配列を回す |
{block name=} | 継承元のtplを上書きする |
{literal} | テンプレートファイル内で、{}を使っている記述があると、smartyの{}と認識してしまい処理がおかしくなるので、ただの文字として認識させるようにする |
簡単にいうと、tplファイル内で{}の中でphpを書くことができるというもの。
基本的には値のみを渡して処理はphp側で行うというのが通常。
このようにしてhtmlファイルとサーバサイドで役割をきっちり分けることが大事かと思います。