如何最好地分离布局和内容?

时间:2015-09-11 19:35:33

标签: php

我想为所有网页使用相同的网站布局(页眉,页脚,侧边栏等)。只有内容发生变化。为了可重用性和可读性,我不希望每次都包含整个布局内容。一个名为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代码。例如,一些会话数据应该显示在标题中,我不想为每个微小的属性引入占位符。

是否有良好方式来评估此类代码,还是我的方法完全失败?

1 个答案:

答案 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的哑术用法。