2010-05-14 60 views
2

我正在使用文件page.php作爲多個內容文件的HTML容器;即,page.php定義了頁面的大部分通用結構,而內容文件只包含每個頁面都獨有的文本。我想要做的是包括一些PHP代碼,每個內容文件都爲頁面定義元數據,例如標題,使用的橫幅圖形等。例如,內容文件可能如下所示(簡化版):在包含()之前使用變量

<?php $page_title="My Title"; ?> 
<h1>Hello world!</h1> 

的文件的名字將被作爲URL參數page.php文件,它看起來像這樣被傳遞:

<html> 
    <head> 
    <title><?php echo $page_title; ?></title> 
    </head> 
    <body> 
    <?php include($_GET['page']); ?> 
    </body> 
</html> 

這種方法的問題是,它是使用後的變量被定義,這當然不起作用。輸出緩衝也似乎沒有幫助。

有沒有其他方法可以使用?我不想將內容文件中的文本定義爲PHP heredoc塊,因爲這會在我的文本編輯器中突出顯示HTML語法。我也不希望在事後使用JavaScript來重寫頁面元素,因爲這些頁面中的很多不會使用JavaScript,如果不需要,我寧願不將它作爲依賴項引入。

+0

爲什麼ob_ *函數不適合你?當你嘗試時會發生什麼? – webbiedave 2010-05-14 17:30:32

+0

ob_ *函數可以工作,但它們不會改變頁面的佈局方式 - $ page_title在定義之前仍然沒有值(這應該是我想的)。 – phenry 2010-05-14 17:36:24

回答

2

大多數人將包含頁面的輸出存儲到另一個變量中。你有沒有試過把包含頁面的所有內容輸出緩衝區,然後存儲ob_get_clean()到一個變量像$page_html,然後讓你的頁面看起來就像這樣:

<?php include($_GET['page']); ?> 
<html> 
    <head> 
    <title><?php echo $page_title; ?></title> 
    </head> 
    <body> 
    <?php echo $page_html; ?> 
    </body> 
</html> 

編輯:所以第二頁會看起來像這樣:

<?php 
$page_title="My Title"; 
ob_start(); 
?> 
<h1>Hello world!</h1> 
<?php $page_html=ob_get_clean(); ?> 
1

我能想到的最好的事情就是將文件的包含從渲染中分離出來。所以,你的模板看起來是這樣的:

<?php include($_GET['page']); ?> 
<html> 
    <head> 
    <title><?php echo $page_title; ?></title> 
    </head> 
    <body> 
    <?php renderPage() ?> 
    </body> 
</html> 

和文件要包括這個樣子的:

<?php 
$page_title="My Title"; 
function renderPage() { 
?> 
<h1>Hello world!</h1> 
<?php 
} 
?> 

這也是好的,因爲你可以傳遞參數給renderPage(),這樣的模板可以通過信息沿着它包含的頁面。