如何在PHP中模板...正确的方法?

时间:2009-09-29 17:35:25

标签: php templates

我开始理解模板在PHP中的重要性。我正在使用PHP本身作为模板引擎来避免学习任何新语言。虽然我对此有所了解,但我还是不清楚。我想知道专家们做了什么。

我应该创建一个完整的页面模板,包含所有表格,表格和其他所有内容(包括页眉和页脚),还是应该将所有表格,表格等放在自己的文件中,然后将它们添加到模板中需要的。

这是一个清理事物的小例子......

我应该

a)创建一个包含所有表格,表格和其他元素的页面,并将其用作最终产品

// Set all the information
$template->title = $username;
$template->user_info = get_user($user_id);
$template->articles = get_articles($user_id);
$template->ads = random_ad($user_info);

// Load the template with everything already in it
$template->load('user_page.tpl')
$template->display();

OR

b)在自己的文件中创建每个表,表单,相关的块元素,然后使用它们创建最终产品

// set the title and load the header template
$header['title'] = $username;
$template->load('header.tpl', $header);

// get the user info as an array and load into user profile template
$user_info = get_user($user_id);
$template->load('user_profile.tpl');

// load the new article form
$template->load('new_article_form.tpl');

// get the articles as an array of info and load into user articles template
$articles = get_articles($user_id);
$template->load('user_articles.tpl', $articles);

// get a random ad based on user info
$ads = random_ad($user_info);
$template->load('advertisements.tpl');

// load the footer template and display final page
$template->load('footer.php');
$template->display();

每个加载的文件都包含需要在最终页面上显示的一小部分内容。

由于Dont Repeat Yourself技术,我会想B,但我想知道哪个以及为什么

5 个答案:

答案 0 :(得分:4)

我个人会说第一种方法是最好的,因为它可以保持所有文档和文档片段在语义上完整。

第二种方法意味着你的header.tpl中有一个<div>,你的footer.tpl中的</div>会关闭(除了可能会有一些标签适用于)。这意味着如果您更改布局,通过在某处添加包装div(例如),您必须记住在另一个文件中关闭它(或者,根据您的布局,两个或三个不同的文件)。

几种不同的嵌入式文件更糟糕。想想调试一个网站有多难,当一个文件 - 有条件地被包含 - 有一个额外的</div>。你得到一个模糊的错误报告“有时页面看起来完全搞砸了,无论我使用哪种浏览器”都非常难以追踪。如果你使用基于表格的布局,那就更糟了..

使用第一种方法,您仍然可以使用DRY原则。您将模板加载到变量中。例如:

$userVars['name'] = $currentUser->name;
$templateVars['userinfo'] = $template->load('userinfo.php', $userVars);

...
$template->display('template.tpl', $templateVars);

您可以通过这种方式持续嵌套文档。有很多好处:

  • 每个文件都是语义上完整的HTML - 所有打开的标签也在同一文档中关闭。编辑布局的一部分很容易,而不会破坏(可能不为人知)其他任何内容。
  • 每个缓存某些模板的输出并重新使用它们
  • 将AJAX应用到网站很容易。例如,您在第一页加载时在<div id="stats">内有一个stats.tpl模板渲染。您还有一个视图,它只是自己呈现stats.tpl模板,然后使用jquery执行$('#stats').load('/ajaxstats.php'),刷新该div但不重复代码。

答案 1 :(得分:2)

每个模板共有的结构的模板继承(例如布局;页眉/页脚),以及可重用位(例如表格)的模板嵌入(即包括)。

使用方法A而没有继承,你要么包含常见的布局元素(这是恕我直言),要么在每个模板中复制整个布局(更糟糕的是)。简单的方法B会为所有内容创建大量的小模板位,这可能会降低可维护性。

为此,我真的建议使用真正的专用模板引擎而不是普通的PHP。它们使生活更轻松(继承是一回事;另一种 - 变量自动转义)。

答案 2 :(得分:1)

模板继承可能会成为最干净的代码。您现在可以使用PHP Template Inheritance

在直接的PHP中执行此操作

答案 3 :(得分:0)

没有好的或坏的解决方案。有技术和指导方针,但随着时间的推移,您将了解哪种方法比其他方法更好。

只要看一下,我会说第二种方法可以让你更灵活,将页面分成更小的部分。较小的可能有时意味着更易于管理。

此外,第二个解决方案还允许超过1个人在页面上工作,因为他们只需要工作/更改页面的一部分而不是整个页面。

的问候,

答案 4 :(得分:0)

正如格雷格马克所说,第一种解决方案可能更可取。话虽如此,我还建议您查看各种可用的PHP框架,其中大多数使用各种技术实现模板。

首先看一下这个list。您可能还想查看一些独立的模板引擎,例如Smarty,以获得一些想法或避免实现自己的引擎。