jco*_*der 11 php model-view-controller
我有一个围绕MVC模式构建的应用程序.视图是PHP,但主要是嵌入了最小PHP代码的html,像这样的东西 -
Welcome <?php echo $USERNAME ?>
Run Code Online (Sandbox Code Playgroud)
和
<table>
<?php foreach ($USERS as $row) : ?>
<tr><td><?php echo $row->name ?><td><?php echo $row->address ?></tr>
<?php endforeach ?>
Run Code Online (Sandbox Code Playgroud)
我只想在这个文件中显示布局逻辑,我想保持简单!
这对我来说真的很有用,但是我在某些方面遇到了困难.例如,查看上面代码中的表,并想象每个列(名称和地址)都有一个标题NameAddress
现在想象一下我想让列可以排序.所以我做了类似的事情 -
<tr><th><a href="?sort=name">Name</a><td><a href="?sort=addr">
Run Code Online (Sandbox Code Playgroud)
但这还不够好.我的视图需要查看正在排序的列,并添加向上或向下箭头.如果该列已经被排序,它需要将当前排序列的链接更改为?sort = name_reverse,以便单击它以另一种方式对其进行排序.现在在我的模板中编写漂亮的整洁代码有点太复杂了......
所以我可以让我的控制器创建包含的变量 -
<tr><th><?php echo $HEADING[0] ?><th><?php $HEADING[1] ?>
Run Code Online (Sandbox Code Playgroud)
但这意味着我的控制器现在正在生成实际的HTML,这实际上是页面模板的责任.它消除了模板以某种不同方式格式化页面的能力......而且感觉不对.
但是我怎么能最好地处理这个问题,我觉得我需要我的页面控制器生成包含HTML的变量...
有什么建议?
将创建表的代码分离到 ViewHelper 中。配置从模板的方法调用。让 ViewHelper 使用所有必需的设置渲染实际的表。然后你的主模板应该只包含这样的一行:
<?php echo table($data, $sortOptions, $otherConfig) ?>
Run Code Online (Sandbox Code Playgroud)
基本上,构建该表所需的任何逻辑都将包含在 ViewHelper 中,这就是您可能希望将其设为一个类的原因。完整的实施将根据您的需求而有所不同。
如果您不想将所有逻辑放入一个大型表帮助程序中,请考虑为表的任何部分创建帮助程序函数。例如,类似的东西
<th><?php echo sortLink('Name', $current); ?></th>
Run Code Online (Sandbox Code Playgroud)
这样,sortLink 帮助程序将决定是否以及如何创建和插入任何排序链接,因此您不必在主模板中包含该逻辑或任何条件。
| 归档时间: |
|
| 查看次数: |
442 次 |
| 最近记录: |