访问Smarty模板

时间:2012-12-16 10:42:52

标签: php smarty smarty3

我的文件结构:

--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模板的正确路径?

1 个答案:

答案 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'的子目录中的所有内容都被认为是'不安全',这使得思考关于什么是安全的,什么是不容易的。