2

私のファイル構造:

--header.php
--smarty
  --templates
    -- x.tpl
  --cache
  --configs
  --templates_c
--articles
  -- testPage.php

header.phpのコード

$smarty = new Smarty();

$smarty->setTemplateDir('smarty/templates');
$smarty->setCompileDir('smarty/templates_c');
$smarty->setCacheDir('smarty/cache');
$smarty->setConfigDir('smarty/configs');

testPage.phpのコード

<?php
  include('../header.php');
  $smarty->display('x.tpl');
?>

私はこのエラーにぶつかっています:

PHP Fatal error:  Uncaught exception 'SmartyException' with message 'Unable to 
load template file 'x.tpl'' in
/usr/local/lib/php/Smarty/sysplugins/smarty_internal_templatebase.php:127

testPage.phpのsmartyテンプレートにアクセスするための正しいパスを設定するにはどうすればよいですか?

4

1 に答える 1

1

短い答えです。testpage.php から 1 つ上のディレクトリに移動して、smarty ディレクトリを含むディレクトリに移動する必要があるため、header.php インクルードで行ったように、smarty インクルード ディレクトリについても同じことを行う必要があります。

$smarty->setTemplateDir('../smarty/templates');

これをうまく行う方法の 1 つは、プロジェクトのルート ディレクトリに到達する方法を定義し、それをインクルードで使用することです。

例 testPage.php

define("PATH_TO_ROOT", "../");

そしてheader.phpで

$smarty->setTemplateDir(PATH_TO_ROOT.'smarty/templates');
$smarty->setCompileDir(PATH_TO_ROOT.'smarty/templates_c');
$smarty->setCacheDir(PATH_TO_ROOT.'smarty/cache');
$smarty->setConfigDir(PATH_TO_ROOT.'smarty/configs');

これによりPHP、別の場所にある可能性のある別のファイルから Smarty ディレクトリを簡単にセットアップできます。たとえば、"tests/webtests/frontend" というディレクトリで、PATH_TO_ROOT を "../../../" として定義すると、Smarty のセットアップへの呼び出しは引き続き機能します。

また、header.php で PATH_TO_ROOT が定義されていることを確認して、直接呼び出されないようにすることもできます。

補足として、Smarty ディレクトリの下に templates_c とキャッシュ ディレクトリを置かず、別の場所に別のディレクトリを作成して、生成されたデータを書き込む (インジェクション攻撃に対して脆弱になる可能性がある) ことを検討することをお勧めします。私のプロジェクトでは、プロジェクトのルート ディレクトリの外に 'var' ディレクトリがあり、ログ ファイル、キャッシュ、生成されたテンプレートなどのすべてのディレクトリを保持しています。何が安全で何がそれほど簡単ではないかについて。

于 2012-12-16T12:56:35.893 に答える