[英]MVC: Should “Display Color” logic be in the View or the Model?
我正在使用CodeIgniter编程票务管理系统,是否有条件着色应该在模型还是在视图中存在MVC难题? 该视图应在网格中显示所有票证。 假设门票有截止日期。 剩余时间不足一个小时时,机票应涂成红色;剩余时间约一到六个小时时,机票应涂成黄色;剩余六个小时以上时,机票应涂成彩色。绿色。
因此, 视图应包含类似
foreach($tickets as $ticket):
if($hours_left >= 6): <span class="green">...</span>
else if($hours_left >= 1 and $hours_left < 6) <span class="yellow">...</span>
if($hours_left < 1): <span class="red">...</span>
还是应该从模型中检索颜色作为属性?
foreach($tickets as $ticket):
<span class="<?php echo $ticket->color; ?>">...</span>
在第一种情况下,视图具有逻辑性,并且不再“笨拙”。 更糟糕的是,如果需要在多个视图中应用此代码,则需要重复难以维护的代码,例如,如果要添加“蓝色”颜色。
在第二种情况下,我将需要在模型中嵌入显示逻辑,这也违反了MVC原理。
颜色逻辑应该放在哪里?
我不会担心颜色。 与一些业务含义而是去确定你的模型(或如果合适的话进一步下跌):
时间<1:迫在眉睫的期限
时间1-6:截止时间-中间
时间> 6:截止日期确定
还是任何有意义的。 然后,将其用作班级,让您随意选择颜色和其他样式。
在这种情况下,颜色是视图问题,很可能在CSS中甚至更远。
另一方面,票证的“状态”是模型信息。 门票从正常到严重到紧急都有一个门槛。 因此,将数据与票证一起提供:
$ticket['status']='severe';
要么
$ticket['status']=$ticketStatusObject
取决于票证状态是否也是对象。
最后,模型进入视图,您可以在其中应用逻辑。 使其具有语义,例如:
<div class="ticket severe">
要么
<div class="ticket" status="severe">
当然,在CSS中,您可以对其进行格式化。
现在,这里有一个有趣的概念,对于MVC来说很难。 颜色就是视图,这基本上是正确的。 但这也可能具有商业目的。 就像路灯变成橘红色。 在那种情况下,我将从模型(TicketStatusObject)中加载颜色。 您仍然可以将它们放在CSS中,但是会基于模型生成CSS,因为它会影响业务。
如果您创建另一个视图层(例如移动应用程序),它将使用相同的模型并显示相同的颜色,因为这对于您的应用程序和业务很重要。
更新:添加了辅助代码示例
我会编写一个辅助函数,您可以在视图中调用该函数以添加正确的CSS。
这样,您就不会弄乱模型的结构,例如,如果数据库中有一个名为ticket_expires
的字段,那么您仍然可以在需要的地方使用此值。
发挥辅助作用;
在/ application / helpers中创建一个名为* ticket_helper.php *的文件。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Add Style to Ticket
*
* @param string $expire_timestamp
*
*/
if ( ! function_exists('set_ticket_colour')) {
function set_ticket_colour($expire_timestamp) {
// do you logic here.
// if you want to access your ticket model then...
$_ci =& get_instance();
// if model isn't autoloaded
$_ci->load->model('ticket_model');
$some_result = $_ci->ticket_model->some_function($some_param);
return $some_result;
}
}
只要记住要在需要时加载此帮助程序,或自动加载它即可。
所以在你看来
<?php echo set_ticket_colour($ticket->expires_time); ?>
我将颜色显示在模型中的逻辑中(第二种方法)
这确实不符合MVC原则。
您真正要做的是在模型中存储故障单少于6小时还是大于6小时。
第二种方法还可以使您的模板保持整洁,从视图中删除表示逻辑,从而使图形设计人员更容易理解视图。
我不是PHP开发人员(因此无法提供代码),但是我将提供一个帮助程序类,该类提供了一个静态方法,该方法接受一个票证对象,该票证对象从中提取了hours_left并将颜色作为字符串返回。
您应该始终努力使您的观点尽可能简洁。 这意味着要尽可能多地删除PHP,并将其推入控制器,模型甚至助手中。
我建议您评估一个帮助程序中每张票证的剩余时间,并使用switch语句返回一个空格分隔的类别列表,该类别应应用于该票证。
然后,在您看来,它很简单:
<? foreach($ticket as $t): ?>
<div class="<?= $t['classes'];?>"><?= $t['name']; ?></div>
<? endforeach; ?>
然后使用CSS标记类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.