将代码与模板中的布局分开

时间:2011-01-12 10:21:24

标签: php model-view-controller

我有一个围绕MVC模式构建的应用程序。 视图是PHP,但主要是嵌入了最小PHP代码的html,像这样的东西 -

Welcome <?php echo $USERNAME ?>

<table>
<?php foreach ($USERS as $row) : ?>
<tr><td><?php echo $row->name ?><td><?php echo $row->address ?></tr>
<?php endforeach ?>

我只想在这个文件中使用显示布局逻辑,我想保持简单!

这对我来说真的很有用,但是我在某些方面遇到了困难。 例如,查看上面代码中的表,并想象每个列(名称和地址)都有一个标题     NameAddress

现在想象一下我想让列可以排序。所以我做了类似的事情 -

<tr><th><a href="?sort=name">Name</a><td><a href="?sort=addr">

但这还不够好。我的视图需要查看正在排序的列,并添加向上或向下箭头。如果该列已经被排序,它需要将当前排序列的链接更改为?sort = name_reverse,以便单击它以另一种方式对其进行排序。 现在在我的模板中编写漂亮的整洁代码有点太复杂了......

所以我可以让我的控制器创建包含 -

的变量
<tr><th><?php echo $HEADING[0] ?><th><?php $HEADING[1] ?> 

等。但这意味着我的控制器现在正在生成实际的HTML,这实际上是页面模板的责任。它消除了模板以某种不同方式格式化页面的能力......而且感觉不对。

但是我怎么能最好地处理这个问题,我觉得我需要我的页面控制器来生成包含HTML的变量......

有什么建议吗?

4 个答案:

答案 0 :(得分:4)

分隔代码以将表创建为ViewHelper。从模板配置方法调用。让ViewHelper渲染具有所有必需设置的实际表。那么你的主模板应该只包含这样的一行:

<?php echo table($data, $sortOptions, $otherConfig) ?>

基本上,构建该表所需的任何逻辑都将包含在ViewHelper中,这就是您可能希望将其作为类的原因。完整的实施将根据您的需求而有所不同。

如果您不想将所有逻辑放入一个大型Table Helper中,请考虑为表的任何部分创建辅助函数。例如,像

这样的东西
<th><?php echo sortLink('Name', $current); ?></th>

这样,sortLink助手将决定是否以及如何创建和插入任何排序链接,因此您不必在主模板中具有该逻辑或任何条件。

答案 1 :(得分:2)

很好的问题,这个网站非常罕见。

首先,你必须接受任何现实生活模板永远不会简单的事实。 而已。它被称为表示逻辑,它遵循演示文稿本身的复杂性。

因此,只需使用与之前相同的方法 - 使用相同的循环和条件运算符,并且可能 - 一些自制的辅助函数,这将破坏模板纯度,但却有很大的帮助。

事实上,你几乎已经钉了它。您可以使用预定义变量,但它们不应包含HTML,只包含要显示的值。

<tr>
 <th>
  <a href="<?=$links['name']['url']?>">
   Name
   <?if($links['name']['dir']=='asc'):?><img src="arrow.gif"><?endif?>
   <?if($links['name']['dir']=='desc'):?><img src="reverse_arrow.gif"><?endif?>
  </a>
 <td>

我很乐意制作一个循环,但我建议不要这样做,因为它会引导你发明一些HTML构建器,这是另一个故事而不像纯HTML本身那样可靠。

对你来说唯一的责任:一个程序员,要求代码帮助,应该带来代码,而不是罗嗦的blab。实际HTML的一个例子会更好,允许回答者不要发明它。

答案 2 :(得分:1)

如果我可以添加建议,您可以将所有PHP输出转换为DOM / XML并将其提供给XSLT处理器,在该处理器中,演示文稿(无论多么复杂)更加一致,因为XSLT和XHTML都基于XML。在物理位置和用于交付内容的技术方面,您确实会将内容与内容分开。

答案 3 :(得分:0)

一种解决方案是使用Javascript排序,jQuery有一些好的。

如果无法做到这一点,您可以查看某些模板解决方案,例如Smarty,以便为您处理模板。