在这个旧网站的Smarty 2.6到Smarty 3.1升级任务中,我拉了2个小时。原因是主机现在仅适用于PHP 7。不再需要PHP5。我认为这将是一个1个小时的交易,但它很快就变成了一场噩梦。我记得在2005年使用Smarty时,我再也没有使用过它,但是今天,将近15年后,这个怪物模板引擎让我回味无穷!
这是init PHP文件的内容:
<?php
#Load Smarty library
#require_once("php/Smarty-2.6.26/libs/Smarty.class.php");
#require_once("php/smarty-3.1.34/libs/Smarty.class.php");
require_once("php/smarty-3.1.34/libs/SmartyBC.class.php");
require_once("php/smarty-3.1.34/libs/sysplugins/smarty_security.php");
class class_init extends SmartyBC {
function __construct(){
#Init
parent::__construct();
#Directories
$this->template_dir = "skin/".SKIN."/public/";
$this->compile_dir = "skin/".SKIN."/compile/";
$this->config_dir = "skin/".SKIN."/config/";
$this->cache_dir = "skin/".SKIN."/cache/";
#Caching
$this->caching = (boolean)SMARTY_CACHING;
$this->cache_lifetime = (int)SMARTY_CACHE_LIFETIME;
$this->debugging = true;
}
function is_cached($str_tpl, $cache_id = NULL, $compile_id = NULL){
return $this->isCached($str_tpl, $cache_id, $compile_id);
}
}
class MySecurity extends SmartySecurity {
public $secure_dir = array('/home/lesclownsducarro/public_html/');
public function __construct(Smarty $smarty){
parent::__construct($smarty);
}
}
?>
这是控制器文件的内容:
require_once("./php/class/init.php");
$_ENV['class_init'] = new class_init();
$securityPolicy = new Smarty_Security($_ENV['class_init']);
$securityPolicy->php_handling = \Smarty::PHP_ALLOW;
$_ENV['class_init']->enableSecurity($securityPolicy);
获取一个完全空白的页面,并且error_log只是指出:
[30-Dec-2019 22:22:40 UTC] PHP Fatal error: Class 'SmartySecurity' not found in /home/xxxxx/public_html/php/class/init.php on line 32
为了向后兼容,我需要使用SmartyBC,因为模板到处都包含PHP文件。 inb4是的,我知道,这不是我的网站。
有什么想法吗?
答案 0 :(得分:1)
DOH。韦尔普,看来我太累了。
显然应该是:$securityPolicy = new Smarty_Security($_ENV['class_init']);
...带有下划线。我不知道,我是从smarty.net复制/粘贴示例的,根本没有注意。此处显示的“新SmartySecurity”:https://www.smarty.net/forums/viewtopic.php?p=72741
JFC。