所以,我有一个我制作的模板引擎,我想用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没有。有什么想法吗?
答案 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);