如何以正确的方式在PHP中使用模板?

4
我开始理解在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();

或者

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();

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

由于“不要重复自己”技术,我认为应该是B,但我想知道具体原因。

5个回答

4

我个人认为第一种方法最好,因为它保持了所有文档和文档片段的语义完整。

第二种方法意味着您将在header.tpl中拥有一个<div>,并由footer.tpl关闭(除非可能会应用几个标签)。这意味着如果您更改布局,例如在某个地方添加包装器div,您必须记得在另一个文件中(或者根据您的布局,在两个或三个不同的文件中)也要关闭它。

对于多个嵌入式文件,情况会更糟。想象一下调试网站时有多难,当一个被条件包含的文件有一个额外的</div>时。您会收到一个模糊的错误报告“有时页面看起来完全混乱,无论我使用什么浏览器”,这非常难以跟踪。如果您正在使用基于表格的布局,则情况更糟。

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

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

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

您可以不断地嵌套文档。这样做有很多好处:
  • 每个文件都是语义完整的HTML,所有被打开的标签都在同一文档中关闭。轻松编辑布局的某个部分,而不会(可能无意中)破坏其他任何东西。
  • 很容易缓存某些模板的输出并重复使用它们
  • 很容易将AJAX应用到网站上。例如,您有一个stats.tpl模板在第一页加载时呈现在<div id="stats">中。您还有一个视图,只是单独呈现stats.tpl模板,然后使用jquery执行$('#stats').load('/ajaxstats.php'),刷新该div但完全不重复代码。

2

模板继承适用于每个模板中常见的结构(例如布局;标题/页脚),而模板嵌入(即包括在内)则适用于可重复使用的部分(例如表单)。

如果采用A方法且没有继承,则可能会添加通用布局元素(这样做看起来很丑陋),或在每个模板中复制整个布局(更糟糕)。而采用B方法则会为每个事物创建大量微小的模板位,这可能会降低可维护性。

因此,我真的建议使用真正的专用模板引擎而不是纯PHP。它们可以让生活更加轻松(继承只是其中之一;另一个是变量自动转义)。


1

使用模板继承可能会产生最干净的代码。您现在可以使用PHP模板继承在纯PHP中实现此功能。


0

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

仅从外观上看,我会说第二种方法使您更加灵活,并将页面分解为较小的部分。有时较小可能意味着更易管理。

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

敬礼,


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接