完成第一步,编写一些页面.在查看结果后,我得到了一个问题......模板中应该有多少代码(View)?
例如,这是一个模板文件:
<?php $this->load->view('header'); ?>
<?php $this->load->view('banner'); ?>
<div id="items">
<?php
for($i=0; $i<count($main); $i++) {
echo '<div class="item">
<div class="name">'.$main[$i]['name'].'</div>';
if($main[$i]['icq']=='') { }
else { echo '<div class="phone">'.$main[$i]['phone'].'</div>'; }
echo '</div>';
}
?>
</div>
<?php $this->load->view('footer'); ?>
Run Code Online (Sandbox Code Playgroud)
您认为此模板中的代码太多或者这是正常的吗?
Gor*_*don 16
第一个答案实际上是现场,但用户删除了它(可能是由于同伴的压力).基本上,您不需要模板中的任何逻辑.在理想的世界中,您拥有所有模型数据的标记,但由于我们处于HTML世界中,因此没有,因此您必须使用XSLT或使用ViewHelpers.
让我们关注ViewHelper方法.
这很难维护:
<div id="items">
<?php
for($i=0; $i<count($main); $i++) {
echo '<div class="item">
<div class="name">'.$main[$i]['name'].'</div>';
if($main[$i]['icq']=='') { }
else { echo '<div class="phone">'.$main[$i]['phone'].'</div>'; }
echo '</div>';
}
?>
</div>
Run Code Online (Sandbox Code Playgroud)
如果用Smarty替换PHP,它将不会变得更好.这很容易维护:
<div id="items">
<?php echo itemlist($items, 'template.htm') ?>;
</div>
Run Code Online (Sandbox Code Playgroud)
在现在删除的问题下面,有一个评论员反对这个"代码对于非编码人员来说不容易维护,因为现在他们不知道项目列表的定义在哪里以及它做了什么." 但这完全是胡言乱语.想想它一秒钟.
一方面,他们声称非编码人员会遇到一个简单的函数调用问题,但另一方面他们希望他们理解与HTML混合的PHP代码的混乱.设计师不关心表示逻辑,而只关心实际的表示.输出.
一个单独的函数调用清楚地说:"这里是一个项目列表",这比"这里是一个for回声div,如果给出icq可能是别的东西"更容易掌握.函数调用与标记一样好.它明确定义了输入和输出.除了开发人员之外,它如何实现输出与任何人无关.
ViewHelper封装了表示逻辑.这是一个可以在所有视图中重用的片段.这比在需要时一遍又一遍地复制和粘贴所有逻辑更加可维护.在上面的示例中,帮助程序有两个参数:
我会将第二个选项作为可选项,因为我认为它始终是相同的模板.但是,由于评论员抱怨非编码人员不知道在哪里看,我觉得有必要说明告诉非编码人员在哪里看起来是多么容易.
function itemlist($items, $template = './templates/itemlist.htm') {
ob_start();
foreach($items as $item) {
include $template;
}
return ob_get_flush();
}
Run Code Online (Sandbox Code Playgroud)
可能有更有效的方法来解决包含模板的问题.但主要想法应该是明确的.隐藏实际模板中的表示逻辑.您的"template.htm"将如下所示:
<div class="item">
<div class="name"><?php echo $item['name'] ?></div>
<?php echo contact($item, 'icq' 'phone'); ?>
</div>
Run Code Online (Sandbox Code Playgroud)
不,如果和没有.没有字符串连接或花括号.决定如何联系用户的逻辑也隐藏在ViewHelper中.所有非编码人员现在都必须知道ViewHelpers的参数,这就像知道要写入标签的属性一样简单.如有必要,给他们一个备忘单.
相关信息:
编辑
由于下面的两条评论,我决定扩大这个答案.以上不是抽象的抽象.它是为了可重用性和可维护性.我已经在上面指出了这一点,但让我再次在这里解释一下.
实际上,我发现反对使用ViewHelpers很奇怪,因为你将"在两个地方进行演示"但不要抱怨分隔页眉,横幅和页脚.这是同一件事.您可以隔离可重用的部件并将它们放入自己的模板中.在该步骤中将逻辑与模板分离只是获得更高可维护性的自然下一步.
包含逻辑的视图模板实际上是脚本而不是模板.任何包含组装逻辑的视图模板都注定要重复.这可能不是小型网站的问题,但如果您正在使用几十个甚至几百个视图和小部件的网站上工作,那么不抽象这些部分将导致代码重复.将所有逻辑放入模板中,它很快就会变成混乱条件的c&p'ed标记.对于任何重复,您将加倍更改它所需的时间.添加内联样式和突出的Javascript,你在维护hell.¹
如果您将OOP用于应用程序的其他部分,那么为什么要在您的视图中使用程序?如果你明白你应该从HTML中分离Javascript和CSS,为什么要将PHP混合到你的模板中?这没有意义.OP的代码片段是脚本而不是模板.因此,它是开发人员的领域.因此,您将所有适用于您应用程序其他部分的良好实践应用于此.这包括将逻辑隔离到函数和/或类中.
当然,寻找脚本的设计师可能不会立即知道发生了什么.但话说回来,一旦你开始添加本机PHP函数,她可能也不会知道.在mb_strimwidth做什么?而且substr?这是什么?:构造?您添加的实际PHP越多,为非开发人员阅读的难度就越大.
如果您希望设计人员使用模板,请不要为他们提供脚本.给他们模板.如果这样做,请将逻辑与其隔离,并用易于掌握的函数调用替换它.使用能够清楚地传达函数功能的函数名称.因此,设计人员只需要知道"我是否使用此输入,我将始终获得该输出.我不关心输出的结果.我将把它留给开发人员".
将逻辑隔离到函数(或类)中还为您提供了直接的优势,即能够单独测试用于在该页面上呈现特定部分的逻辑.您不必设置创建页面所需的整个环境,只需传入所需的输入并断言它的输出(这就是函数缓冲字符串而不是输出btw的原因).
¹ 对于那些认为这不是问题的人,我强烈建议您找到一个真正保留视图模板中所有逻辑的遗留应用程序.尝试改变一些事情.一旦你有幸吃了2500行意大利面条代码,每个代码至少有500个字符,并且包含重复的PHP,HTML,CSS和JavaScript,你就会知道我在说什么.
我不认为你在视图中想要实现的是太多的逻辑,但我认为应该稍微清理一下.
就像是:
<?php foreach($main as $item): ?>
<div class="item">
<div class="name"><?php echo $item['name']; ?></div>
<?php if($item['icq']): ?>
<div class="phone"><?php echo $item['phone']; ?></div>
<?php endif; ?>
</div>
<?php endforeach; ?>
Run Code Online (Sandbox Code Playgroud)
我发现它更容易阅读,并且它做同样的工作.我也不认为非编码人员难以修改,这最终是视图的目标.
| 归档时间: |
|
| 查看次数: |
2288 次 |
| 最近记录: |