使用自定义模板引擎如何用PHP替换内容

时间:2012-11-27 21:46:47

标签: php html

所以,我有一个我制作的模板引擎,我想用PHP文件中的内容替换{pageBody},当我使用模板引擎执行它时,它不执行PHP,而是在视图源选项中显示它

的template.php

<?php
class TemplateLibrary {
    public $output;
    public $file;
    public $values = array();

    public function __construct($file) {
        $this->file = $file;
        $this->file .= '.tpl';
        $this->output = file_get_contents('templates/'.$this->file);
    }

    public function replace($key, $value)
    {
        $this->values[$key] = $value;
    }

    public function output() {
        foreach($this->values as $key => $value)
        {
            $ttr = "{$key}";
            $this->output = str_replace($ttr, $value, $this->output);
        }
        return $this->output;
    }
}

index.tpl
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>{page_title}</title>
{page_style}
</head>

<body>
{page_header}
{page_body}
{page_footer}
</body>
</html>

HTML替换工作正常,但PHP没有。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您的文件相当分散,列表不完整。我已经列出了你目前提供的所有文件。

上面的@Jonathon是正确的,你将需要使用输出缓冲来捕获PHP文件的输出和include()文件(因此它被执行)而不是使用file_get_contents()(这是不执行文件。)

[edit]我在本地环境中重新创建了所有这些文件,并确认@ Jonathon的建议完美无缺。我已更新 dev / replacements.php 以包含建议的代码。

此外,我还为TemplateLibrary课程添加了另外两个功能:replaceFile($key, $filename)执行file_get_contents($filename),以便您不必经常重复,{{1}捕获输出时执行replacePhp($key, $filename),这样就可以封装包含PHP文件的复杂性。

祝你好运!

<强> main.php

include()

<强>开发/ templatelibrary.php

<?php
require_once 'dev/dev.class.php';
require_once 'dev/templatelibrary.php';
$dev = new dev('netnoobz-billing');
$dev->loadLib('JS', 'js', 'jquery');

// template library and required files
$template = new TemplateLibrary('index');
require_once 'dev/replacements.php';


echo $template->output();

<强>在index.tpl

<?php
class TemplateLibrary {
    public $output;
    public $file;
    public $values = array();

    public function __construct($file) {
        $this->file = $file;
        $this->file .= '.tpl';
        $this->output = file_get_contents('templates/'.$this->file);
    }

    public function replace($key, $value)
    {
        $this->values[$key] = $value;
    }

    public function replaceFile($key, $filename)
    {
        $this->values[$key] = file_get_contents($filename);
    }

    public function replacePhp($key, $filename)
    {
ob_start();
include($filename);
$data = ob_get_clean();
        $this->values[$key] = $data;
    }

    public function output() {
        foreach($this->values as $key => $value)
        {
            $ttr = "{$key}";
            $this->output = str_replace($ttr, $value, $this->output);
        }
        return $this->output;
    }
}

<强> replacements.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>{page_title}</title>
{page_style}
</head>

<body>
{page_header}
{page_body}
{page_footer}
</body>
</html>

<强>装载机/ pageBody.php

<?php
$configStyleSheet = '<style type="text/css">'
                  . file_get_contents('styles/default/main.css')
                  . '</style>';
$pageHeader = file_get_contents('templates/header.tpl');
$pageFooter = file_get_contents('templates/footer.tpl');

#$pageBody   = file_get_contents('loaders/pageBody.php');
ob_start();
include('loaders/pageBody.php');
$pageBody = ob_get_clean();

$template->replace('{page_style}' , $configStyleSheet);
$template->replace('{page_title}' , 'NetBilling');
$template->replace('{page_header}', $pageHeader);
$template->replace('{page_footer}', $pageFooter);
$template->replace('{page_body}'  , $pageBody);

[edit]在OP的评论中添加了 loaders / pageBody.php

[edit]更新 dev / replacements.php 以捕获输出缓冲区并在.php上使用include

答案 1 :(得分:0)

您在pastebin代码中使用了file_get_contents,但您应该使用模板处理器或PHP的include()代替。如果您执行$ template-&gt; replace('{page_header}',$ pageHeader),$ pageHeader只是tpl的源代码,而您的模板处理器不知道这样,所以它只会用该源代替标记。修正:

$pageHeader = new TemplateLibrary('header');
// ...
$template->replace('{page_header}', $pageHeader->output());

对于PHP文件,您应该在文件上调用include(),包含在输出缓冲中,这样您就可以将PHP执行的输出作为模板变量传递,而不是PHP源本身:

ob_start();
include('loaders/pageBody.php');
$pageBody = ob_get_clean();
/// ...
$template->replace('{page_body}', $pageBody);