smarty ~テンプレートファイルから別のテンプレートファイルを呼び出す~

Happy White day!
お久しぶりです。ishikawaです。

 
今回の話は、smartyを使ってファイルのincludeをして出した以下のエラーについてです!

 Unable to read template file 'hoge.tpl'


 

そもそも何を作ろうとしたのか

テンプレートファイルの中から、テンプレートファイルを読み込もうとしました。
例えば下記↓

 
index.tpl

<html>
<head><title></title></head>
<body>
   {include file='hoge.tpl'}
</body>
</html>

 
hoge.tpl

hogehoge

 
画面の表示結果は、こうなるはず。(ここで冒頭のエラーが表示されてしまいました・・・。)

hogehoge

 
フォルダ構成は以下

views
  ┗ templates
        ┗ test
            ┣ index.tpl
            ┗ hoge.tpl

 

さぁ、原因を追究しよう。

smartyのマニュアルでは、下記の記載が…
参照:http://www.smarty.net/docsv2/ja/template.resources.tpl

使用したいテンプレートへのパスを、 $template_dir のルートディレクトリからの相対パスで指定します。

 
おっと、$template_dirとはなんなのか。こちらもsmartyマニュアルでは、
参照:http://www.smarty.net/docsv2/ja/api.variables.tpl#variable.template.dir

$template_dir
これは、デフォルトのテンプレートディレクトリの名前です。 
ファイルのインクルード時にリソースの種類を指定しなかった場合は、 
このディレクトリから探します。デフォルトは ./templates で、 
これは、実行しているスクリプトと同じ場所にある templates/ ディレクトリを探すということです。

とあり、./templates から対象のファイルをパス指定すべきであることが分かります。
 

解決

ここまでの情報を得ておきながら、ずっとうまくいかず悩んでいたのですが、
私の場合は、下記の文章をちゃんと読んでいなかったのが原因だと分かりました。

$template_dir のルートディレクトリからの相対パス

 
ずっと、呼び出し元からの相対パスを指定していました。
ルートディレクトリからの相対パスなので、この場合は、以下のようになります。
 
index.tpl

<html>
<head><title></title></head>
<body>
   {include file='../test/hoge.tpl'}
</body>
</html>

 

フォルダ構成は以下

views
  ┗ templates
        ┗ test
            ┣ index.tpl
            ┗ hoge.tpl

 
これで解決しました。お疲れ様ですー。


Tags: