2

したがって、作成したテンプレート エンジンがあり、{pageBody} を PHP ファイルのコンテンツに置き換えたいと考えています。テンプレート エンジンを使用してこれを行うと、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を更新しました。

さらに、TemplateLibraryクラスにさらに 2 つの関数を追加replaceFile($key, $filename)しました。file_get_contents($filename)これにより、頻繁に繰り返す必要がなくなり、出力をキャプチャしながらreplacePhp($key, $filename)実行されるinclude()ため、PHP ファイルを含める複雑さをカプセル化できます。

幸運を!

main.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();

dev/templatelibrary.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;
    }
}

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>

replacements.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 に答える