Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从模板中的布局中分离代码_Php_Model View Controller - Fatal编程技术网

Php 从模板中的布局中分离代码

Php 从模板中的布局中分离代码,php,model-view-controller,Php,Model View Controller,我有一个围绕MVC模式构建的应用程序。 视图是php,但大部分是html,嵌入了最少的php代码,类似这样的东西- Welcome <?php echo $USERNAME ?> 欢迎您 及 我只想在这个文件中显示布局逻辑,我想保持它的简单 这对我来说是非常有效的,但是我在某些方面有点困难。 例如,查看上面代码中的表,想象每一列(名称和地址)都有一个标题 姓名地址 现在想象一下,我想使列可排序。所以我把它做成- <tr><th><a href="

我有一个围绕MVC模式构建的应用程序。 视图是php,但大部分是html,嵌入了最少的php代码,类似这样的东西-

Welcome <?php echo $USERNAME ?>
欢迎您


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

这对我来说是非常有效的,但是我在某些方面有点困难。 例如,查看上面代码中的表,想象每一列(名称和地址)都有一个标题 姓名地址

现在想象一下,我想使列可排序。所以我把它做成-

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

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

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

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

但这意味着我的控制器现在正在生成实际的HTML,这实际上是页面模板的责任。它删除了模板以不同方式格式化页面的功能。。。只是感觉不对

但我如何才能最好地处理这个问题,我觉得我需要我的页面控制器生成包含HTML的变量


有什么建议吗?

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


如果这是不可能的,你可以看看一些模板解决方案,比如为你处理模板制作。

非常好的问题,这在这个网站上是非常罕见的

首先,你必须接受一个事实,任何现实生活中的模板都不会简单。 就这样。它被称为表示逻辑,它遵循表示本身的复杂性

因此,只需像以前一样使用相同的循环和条件运算符,并可能使用一些自制的帮助函数,这将破坏模板纯度,但非常有用

事实上,你几乎已经成功了。您可以使用预定义的变量,但是它们不应该包含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为例会更好,这样回答者就不会凭空发明它。

将创建表格的代码分离到ViewHelper中。从模板配置方法调用。让ViewHelper使用所有必需的设置渲染实际表。然后,主模板应仅包含以下行:

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

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

如果你不想把所有的逻辑放在一个大的表帮助器中,考虑为表的任何部分制作辅助函数。比如说

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


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

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

我同意您对javascript的看法,但我主要对代码设计的一般答案感兴趣。我相信smarty也会有同样的问题——在某个时候,你会被诱惑只将HTML标记输入到模板中……这是一个有趣的想法,但它并不能真正解决我的问题,那就是将任何复杂的代码排除在“视图”之外,这样那些不是全职程序员的人就可以创建主题。我尊重XSLT,但简单并不是它最好的方面之一。这实际上取决于您对简单的定义。例如,如果你曾经深入研究过其他人的joomla模板,你会发现php和html的混合毫无意义,你可以花上几天的时间在作者创造性思维的迷宫中穿梭。xslt可以通过制作解决常见任务的预先制作的模板来简化,同时让程序员可以自由制作自己的模板。无论如何,我同意xslt不适合入门级的程序员,但事实上它比普通的php/html混合更容易维护。sortlink之类的东西允许“设计人员”转换数据,而无需编写复杂的代码。而且原始数据仍然存在,因此它不会强制使用一种特定的样式,不像在变量中提供HTML
<th><?php echo sortLink('Name', $current); ?></th>