2010-04-01 65 views
6

我想讓我的新項目更容易開發,並且我想要一個簡單的骨骼非常簡單的模板引擎解決方案。我在網上環顧四周,一切都不是太臃腫,就是讓我感到畏縮。帶變量的PHP模板類?

我的HTML文件會像這樣:

<html> 
    <head> 
     <title>{PAGE_TITLE}</title> 
    </head> 
    <body> 
     <h1>{PAGE_HEADER}</h1> 
     <p>Some random content that is likely not to be parsed with PHP.</p> 
    </body> 
</html> 

很顯然,我要的東西我設置用PHP來取代{PAGE_TITLE}{PAGE_HEADER}。就像這樣:

<?php 

    $pageElements = array(
          '{PAGE_TITLE}' => 'Some random title.', 
          '{PAGE_HEADER}' => 'A page header!' 
         ); 

?> 

而且我使用類似str_replace並加載HTML替換成一個字符串,然後將它打印到頁面?這就是我目前正在做的事情......有沒有人有任何建議或我可以做得更好的方法?

謝謝。

+1

「令我生厭」讓我覺得你根本不明白他們不是在做的努力很感興趣。真的沒有必要重新創造這個特定的輪子。使用Smarty或Twig或類似的東西。 – cletus 2010-04-01 23:55:17

+1

我的意思是他們解析HTML文件並替換變量的方式,我只是不喜歡它。因爲我想要的,Smarty太臃腫了。 – Joe 2010-04-01 23:56:39

回答

2

如果你想變得非常簡單,PHP本身就是一個模板的引擎。只需使用include()

file.phtml:

<html> 
    <head> 
     <title><?=$tpl['PAGE_TITLE']?></title> 
    </head> 
    <body> 
     <h1><?=$tpl['PAGE_HEADER']?></h1> 
     <p>Some random content that is likely not to be parsed with PHP.</p> 
    </body> 
</html> 

code.php:

tpl = Array 
(
'PAGE_HEADER' => "This is the lazy way to do it", 
'PAGE_TITLE' => "I don't care because i am doing it this way anyways" 
) 
include("file.phtml") 
+0

這基本上是我如何做到的。沒有必要過分複雜的東西,對吧? – 2010-04-02 01:05:02

+0

這是行不通的,除非你的file.phtml中的html位於一個變量中並且你迴應它。簡單地將大括號放在包含的html文件的中間不會使其可以通過php解析。也許你的意思是<?或<?php,然後和echo或=。 – Pere 2013-09-11 08:36:29

+1

@Pere,你是對的。就像看着老SO帖子的代碼很有趣。修正了。 – 2013-09-11 21:13:12

6

您當前的戰略工作,是非常簡單的。 str_replace()是高效且乾淨的,您可以簡單地循環它以替換與變量內容的完全標記匹配。然而,缺點是您必須首先將所有模板加載到字符串中,而且效率相當低。

一個非常相似的替代方法,你可以簡單地使用extract()。解壓縮將獲取一組鍵/值對,並在本地範圍內創建其中的變量。如果你在同一範圍內有一個模板,你的變量將準備就緒。

事情是這樣的:

function loadTemplate($template,$vars) 
{ 
    extract($vars); 
    include($template); 
} 

你的模板可能只是普通的PHP。

<html> 
    <head> 
     <title><?php echo $PAGE_TITLE ?></title> 
    </head> 
    <body> 
     <h1><?php echo $PAGE_HEADER ?></h1> 
     <p>Some random content that is likely not to be parsed with PHP.</p> 
    </body> 
</html> 

(當然你可以使用短標記少模板冗長,但我不想爲了兼容性的原因)

然後,所有你需要做的是:

$pageElements = array(
         'PAGE_TITLE' => 'Some random title.', 
         'PAGE_HEADER' => 'A page header!' 
        ); 
loadTemplate('file.phtml',$pageElements); 
5

你可能對mustache.php感興趣。這是一個非常輕量級的PHP類實現Mustache

簡單的例子的自述採取:

<?php 
    include('Mustache.php'); 
    $m = new Mustache; 
    echo $m->render('Hello {{planet}}', array('planet' => 'World!')); 
    // "Hello World!" 
?> 

和更深入的例子 - 這是規範的鬍子模板:

Hello {{name}} 
You have just won ${{value}}! 
{{#in_ca}} 
Well, ${{taxed_value}}, after taxes. 
{{/in_ca}} 
0
function parseVars($vars, $file){ 

    $file = file_get_contents($file); 
    foreach($vars as $key => $val){ 
     str_replace("{".$key."}", $val, $file); 
    } 

    echo $file; 

}