2

因此,我制作了一个模板引擎,我想用 PHP 文件中的内容替换 {pageBody},当我使用模板引擎执行此操作时,它不会执行 PHP,而是在查看源选项中显示它。

模板.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 不行。有任何想法吗?

4

2 回答 2

2

您的文件相当分散,并且列表不完整。我在下面列出了您迄今为止提供的所有文件。

上面的@Jonathon 是正确的,您将需要使用输出缓冲来捕获 PHP 文件和include()文件的输出(以便执行)而不是使用file_get_contents()(不执行文件)。

[编辑] 我在本地环境中重新创建了所有这些文件,并确认 @Jonathon 的建议非常有效。我已经更新了dev/replacements.php以包含建议的代码。

此外,我在您的类中添加了另外两个函数TemplateLibraryreplaceFile($key, $filename)这样file_get_contents($filename)您就不必经常重复它,并且replacePhp($key, $filename)执行一段include()时间来捕获输出,因此您可以封装包含 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();

开发/模板库.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 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;
    }
}

索引.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>

替代品.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);

装载机/pageBody.php

<?php echo 'test'; ?>

[编辑]从 OP 的评论中添加了loaders/pageBody.php 。

[编辑] 更新了dev/replacements.php以捕获输出缓冲区并在 .php 上使用包含

于 2012-11-28T01:19:14.077 回答
0

您在 pastebin 代码中使用了 file_get_contents,但您应该使用模板处理器或 PHP 的 include()。如果您执行 $template->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);
于 2012-11-27T22:33:00.173 回答