我想为所有网页使用相同的网站布局(页眉,页脚,侧边栏等)。只有内容发生变化。为了可重用性和可读性,我不希望每次都包含整个布局内容。一个名为WebsiteFormatter
的课程应该有帮助
class WebsiteFormatter {
private $title;
private $body;
function addWebsiteTitle($title) {
$this->title = $title;
}
function addWebsiteBody($body) {
$this->body = $body;
}
function getWebsite() {
// load basic framework from file
$html = file_get_contents("../sites/hui.php");
$vars = array(
'{$title}' => $this->title,
'{$body}' => $this->body);
echo strtr($html, $vars);
}
}
随机页面可能如下所示:
$layout = new WebsiteFormatter();
$layout->addWebsiteTitle("Foo Barr");
$body = "<h1> The Holy Grail </h1><p>Once upon a time ...</p>";
$layout->addWebsiteBody($body);
echo $layout->getWebsite();
在getWebsite()
中加载基本布局。然后占位符被实际内容替换。这很好,但实际上我想评估一些嵌入在布局中的PHP代码。例如,一些会话数据应该显示在标题中,我不想为每个微小的属性引入占位符。
是否有良好方式来评估此类代码,还是我的方法完全失败?
答案 0 :(得分:2)
您可以使用include()
执行底层PHP脚本。如果您不想立即输出,可以将输出重定向到变量并将其附加到您的html字符串。
例如:
ob_start();
$vars = array(
'{$title}' => $this->title,
'{$body}' => $this->body);
include "../sites/hui.php"; //can reference $vars as usual
$buffer= ob_get_contents();
ob_end_clean();
$html .= $buffer;
在一个非常类似的项目上,我们这样做了:
abstract class Page
...
private $html;
public abstract function renderPage();
...
public function parseTemplate($template, $data = array()) {
ob_start(); //Start output buffering
include("templates/" . $template . ".php"); //generate output
$html = ob_get_clean(); //catch output buffer
return $html; //return rendered html
}
}
(ob_get_clean
等于ob_get_contents
后跟ob_end_clean
)
其中页面扩展了Page
- 类
class Dashboard extends Page{
function renderPage(){
...generate data-array
$this->html .= $this->parseTemplate("dashboard", $data);
}
}
和templates/Dashboard.php
只包含$data
数组和html-markup的哑术用法。