最近,我把一个2004年的古老PHP应用移到了一个新安装的Linux主机上。原本是用PHP4编写的,但在PHP5上没有做任何修改就可以使用。
现在用PHP7和Phar渲染Pear HTML_Template_IT出现了问题。不工作的代码是这样的
<?php
require_once("HTML/Template/IT.php");
class Layout_normal
{
function __construct($views)
{
$this->views = $views;
$Tt = new HTML_Template_IT("../tpl");
$Tt->loadTemplatefile("layoutNormal.tpl");
foreach($views as $view => $data)
{
if($view == "main") {
$Tt->setVariable("PAGE", $data);
}
elseif($view == "help")
{
$Tt->setCurrentBlock("help");
$Tt->setVariable("HELP", $data);
$Tt->parseCurrentBlock();
}
elseif($view == "pagename") $Tt->setVariable("PAGENAME", $data);
elseif($view == "active") $active = $data;
elseif($view == "module") $module = $data;
}
$Tt->setVariable("MENU", $this->getMenu($view));
$Tt->setVariable("TOPMENU", $this->getMenu($view));
$this->page = $Tt->get();
}
// some more methods here
}
?>
从该代码中,变量{{PAGE}}被渲染为预期,但{{MENU}}和{{TOPMENU}}没有渲染。同样的代码在旧的PHP5环境下也能用。
原因是当当前块设置为 "帮助" $Tt->setCurrentBlock("help");
始终没有从那里返回。所以在这里加上最后一行就解决了这个问题。
elseif($view == "help")
{
$Tt->setCurrentBlock("help");
$Tt->setVariable("HELP", $data);
$Tt->parseCurrentBlock();
$Tt->setCurrentBlock("__global__"); // <- THIS DID THE MAGIC
}
在PHP5中,你不需要设置 __global__
回到当前区块,但更新到PHP7和更新版本的Pear(准确的说是API版本1.1.1)后,你需要这样做。