2011-01-12 106 views
11

代码我身边有一个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

分离代码以创建表格到ViewHelper中。从模板配置方法调用。 ViewHelper使用所有必需的设置呈现实际的表格。然后,您的主模板应该只包含这样一行:

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

基本上,构建表所需的任何逻辑将包含在视图助手这就是为什么你可能要使它成为一个类中。完整的实施将根据您的需求而有所不同。

如果你不想把所有的逻辑放到一个大的表帮助器中,考虑为表的任何部分做辅助函数。举例来说,像

<th><?php echo sortLink('Name', $current); ?></th> 

这样,sortLink助手将决定是否以及如何创建并插入任何形式的联系,所以你不必有逻辑或主模板中的任何条件语句。

+1

我喜欢这个。 像sortlink这样的东西可以让“设计师”转换数据而不会让他们编写复杂的代码。原始数据仍然存在,因此它不会像强制变量中提供HTML那样强制某种特定风格 – jcoder 2011-01-12 14:37:24

0

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

如果这是不可能的,你可能会看一些像Smarty这样的模板解决方案来为你处理模板。

+0

我同意你在这种情况下的JavaScript,但我主要是在代码设计的一般答案感兴趣。我相信聪明会有同样的问题 - 在某种程度上,你会试图将HTML标记提供给你的模板... – jcoder 2011-01-12 10:32:12

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本身。

你唯一的责任是:一位程序员,要求代码帮助,应该带代码,而不是罗嗦的话。一个实际的HTML例子会好得多,这样回答者就不会将它发现出来。

1

如果我可以添加一个建议,可以将所有PHP输出转换为DOM/XML,并将其提供给XSLT处理器,因为XSLT和XHTML都基于XML,所以表现形式更为复杂一致。您无论是在物理位置还是用于交付的技术方面,都会将内容从内容中分离出来。

+0

有趣的想法,但它不能真正解决我的问题,即将任何复杂的代码保留在“视图”之外,不是全职编程人员可以创建主题。我尊重XSLT,但简单并不是最好的方面之一。 – jcoder 2011-01-12 14:35:51