2010-05-14 63 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(),这样的模板可以通过信息沿着它包含的页面。