我的文件结构:
--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模板的正确路径?
答案 0 :(得分:1)
简短回答,因为你需要从testpage.php上一个目录到达包含你的smarty目录的目录,就像你为header.php做的那样,你需要为smarty做同样的事情包括目录。
$smarty->setTemplateDir('../smarty/templates');
这样做很好的一种方法是定义如何到达项目的根目录,然后在include中使用它。
e.g。在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和cache目录,而是在别处创建一个单独的目录来写入生成的数据(因此可能容易受到注入攻击)。对于我的项目,我有一个位于项目根目录下的'var'目录,该目录包含日志文件,缓存,生成的模板等所有目录。来自'var'的子目录中的所有内容都被认为是'不安全',这使得思考关于什么是安全的,什么是不容易的。