2009-11-25 63 views
7

我学习了很多关于如何通过环视和研究现有MVC框架的工作。似乎我看到的每个框架都有一个布局,每个控制器中的每个方法都有自己的模板文件。所以会有一个登录模板,一个注销模板,注册,等等。使用PHP创建html模板

我的问题是,如何以及为什么要在一个文件中为整个页面创建一个模板。假设您想要在多个页面上显示登录表单,是不是必须为每个您希望显示的模板创建登录表单?这不是违背了不要重复自己的规则(干)吗?

到目前为止,我一直在做的事情是我一直在创建liitle模板块,然后将它们组合起来创建每个页面。因此,而不是做这样的事情,

$title = 'Blah Blah Blah'; 
$user = 'Jon Miller'; 

include 'index.phtml'; 

<html> 
    <head> 
    <title><?php echo $title; ?></title> 
    </head> 
    <body> 
    <h3><?php echo $user; ?></h3> 
    <form>login form</form> 
    </body> 
</html> 

我一直在做这个

$title = 'Blah Blah Blah'; 

include 'header.phtml'; 

$user = 'Jon Miller'; 

include 'user.phtml'; 
include 'login_form.phtml'; 
include 'footer.phtml'; 

header.phtml 
<html> 
    <head> 
    <title><?php echo $title; ?></title> 
    </head> 
    <body> 

user.phtml 
    <h3><?php echo $user; ?></h3> 

login_form.phtml 
    <form>login form</form> 

footer.phtml 
    </body> 
</html> 

至于送花儿给人,我只是想知道正确的方式去做,有如何以及为什么一起。这似乎违背了DRY规则。

感谢

回答

1

一个字:组织。分离页面的每个部分将允许分别查看/编辑它们中的每一个。这个简单的概念是非常有益的。例如,团队中想要处理登录过程的任何人都可以很容易地发现他们必须编辑login_form.phtml,他们可以确定编辑login_form.phtml不会无意中干扰其他功能。

作为最佳实践,这里是我如何做(不完全但相似)。

$Title = 'Blah Blah Blah'; 
$User = 'Jon Miller'; 

$ThemeName = "MyGreenPage"; 
$Contents = array("User", "Login_Form"); 

function Include($FileName) { 
    if (file_exists($FileName)) 
     include $FileName; 
} 

MyGreenPage.phtml

<html> 
    <head> 
    <title><?php echo $title; ?></title> 
<?php 
    foreach($Contents as $Content) 
     Include("$Content.pcss"); 
?> 
<?php 
    foreach($Contents as $Content) 
     Include("$Content.pjs"); 
?> 
    </head> 
    <body> 
<?php 
    foreach($Contents as $Content) 
     Include("$Content.phtml"); 
?> 
    </body> 
</html> 

User.pcss

/* Some styles needed by User */ 

User.pjs

/* Some script needed by User */ 

User.phtml

<h3><?php echo $user; ?></h3> 

Login_Form.pcss

/* Some styles needed by Login_Form */  

Login_Form.pjs

/* Some script needed by Login_Form */ 

Login_Form.phtml

<form>login form</form> 

让我再次提醒你,这不就是我做什么(我做什么用OOP),所以这可能并不完全如平时一样运行,您可能需要对其进行编辑。

3

你应该检查出的 'layouts' 和 'view helpers' 的概念。虽然我链接了这些概念的Zend Framework版本,但其他MVC框架(以及MVC概念)也应该包含它们。

基本的想法是,您的网页'视图' - 例如登录表单 - 包含在您的网站'布局'中 - 一般用于整个网站的模板。当您请求具有不同视图的其他控制器(例如用户配置文件)时,该视图也包含在同一个布局中。

要在所有页面中包含类似登录表单的内容,可以使用视图助手。该视图助手可以显示当前用户,或根据登录状态显示登录表单。视图助手可以包含在布局中,或者由特定控制器包含(只要MVC框架允许某种指定的渲染段)。

由于您的模板不需要拆分HTML标签,所以两步'include'方法比线性包含部分(包括标题,内容,然后是页脚 - 现在正在执行的操作)更好。 Zend指南在布局中有一个good visual example视图模板。

0

对于我正在开发的这个项目,所有视图都是XSL模板。我不是将变量传递给视图,而是在控制器中生成所有的XML并将其转换为视图。

我喜欢这种结构,因为我可以将我的所有模板保留在一个文件中,并按照我的意愿安排它们。它也是一种标准的模板语言,非常灵活,并且有大量的文档。到目前为止,这一直非常成功。

这个结构的一个很好的例子是WoW Armory网站(查看源代码)。

1

最常见的方式做HTML模板,使用PHP,是使用这些流行的模板引擎之一:


或者,你可以把你的HTML占位符看起来像<% variablename %>。只需加载你的HTML,做一个正则表达式找到所有的占位符,并用相应的变量替换它们。


或者,您可以加载您的HTML,将其解析为DOM document,然后修改您的DOM。我创建了库DOM Query以便能够使用类似于jQuery的语法来完成此操作,但您也可以使用vanilla PHP或其他几个库中的一个。


或者,您可以在JavaScript前端做一些HTML模板。如果你想在前端和后端做HTML模板,你可能要考虑使用Mustache,因为mustache模板既可以用在前端(用JavaScript),也可以用在后端(用PHP)。