0

私は新しい CMS に取り組んでおり、テンプレート エンジンを作成しようとしました。その上に翻訳システムを追加しましたが、うまくいきません。テンプレートのクラスは次のとおりです。

    <?php

class Template {
    private $vars = array();

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

    public function render($template_name){
        $path = 'templates/default/'.$template_name.'.html';

        if(file_exists($path)){
            $contents = file_get_contents($path);

            foreach($this->vars as $key => $value){
                $contents = preg_replace('/\['.$key.'\]/', $value, $contents);
            }

            $site_theme = 'default';
            $contents = preg_replace('/\<\!\-\- if (.*) \-\-\>/', '<?php if($1) : ?>', $contents);
            $contents = preg_replace('/\<\!\-\- else \-\-\>/', '<?php else : ?>', $contents);
            $contents = preg_replace('/\<\!\-\- endif \-\-\>/', '<?php endif; ?>', $contents);
            $contents = preg_replace('/\<\!\-\- include:(.*) \-\-\>/', '<?php include "templates/$site_theme/$1"; ?>', $contents);
            $contents = preg_replace('/\<\!\-\- is_logged \-\-\>/', '<?php logged() ? include "templates/'.$site_theme.'/logged.html" : logged(); ?>', $contents);
            $contents = preg_replace('/\<\!\-\- not_logged \-\-\>/', '<?php logged() ? : include "templates/'.$site_theme.'/unlogged.html"; ?>', $contents);

            eval(' ?> '.$contents. ' <?php '); 
        } else {
            // What if i told you template don't exist?
            exit('<h1>Template path don't exist. </h1>');
        }

    }

}

?>

索引:

<?php

        $template = new Template;

    $template->assign('lang_title', $lang['cat_categories']);

    $template->render('index');

?>

翻訳ファイル:

<?php

$lang['db_connect_failed']      = 'Unable connect to database';


$lang['cat_categories']     = 'Categories';

?>

そして、これが私の問題です。templates/default/index.html ファイルに [variable] を追加すると、すべてが機能し、表示する必要があるものが表示されます。しかし、たとえば、templates/default/inc/header.html などのテンプレートにインクルード ファイルを追加し、そのファイルに変数を追加すると、機能しません。PHPを使用して親フォルダーにあるindex.htmlにそのファイルを含めるか、変更したHTMLコメントが機能しません。インクルード ファイルに [lang_translate] を追加するか、ヘッダーまたはインデックスに $lang['cat_categories'] (index.html でも機能しない) を追加して、翻訳を表示します。

すべてのファイル パスは問題なく動作します。私は今何ができますか?

4

1 に答える 1

0

次に、これを行うとうまくいくはずです:

// function names migt differ. Check output buffering on php.net
Ob_start();
include index.html;
$contents = ob_get_clean();

これで、コンテンツにはヘッダー ファイルも含まれます。ところで、テンプレート エンジンを使用することをお勧めします。誰かが作成した未知のテンプレート ファイルで eval を使用するのは危険です。

于 2014-01-31T03:42:28.797 に答える