我正在编写一个带有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原则。
应该在哪里放置颜色逻辑?
答案 0 :(得分:3)
我不担心颜色。而是考虑一些商业含义,并在模型中确定 (或者在适当的情况下进一步向下):
时间&lt; 1:截止日期临近
时间1 - 6:截止日期 - 中间
时间&gt; 6:截止日期 - 确定
或任何有意义的事情。然后使用它作为你的班级,让你随意选择颜色和其他样式。
答案 1 :(得分:3)
在这种情况下,颜色是一个视图问题,很可能在CSS中更远。
另一方面,票证的“状态”是模型信息。票证从正常到严重到紧急都有一个阈值。所以用票证提供这些数据:
$ticket['status']='severe';
或
$ticket['status']=$ticketStatusObject
取决于故障单状态是否也是对象。
最后,Model得到了视图,你可以应用逻辑。使其成为语义,例如:
<div class="ticket severe">
或
<div class="ticket" status="severe">
当然,在CSS中你可以格式化它。
现在有一个有趣的概念,这对MVC来说很难。颜色是视图,这是最基本的真实。但它也可能具有商业目的。就像街灯走绿绿橙红。在这种情况下,我会从模型(TicketStatusObject)加载颜色。您仍然可以将它们放在CSS中,但会根据模型生成CSS,因为它会影响业务。
如果您创建另一个视图图层(如移动应用程序),它将使用相同的模型并显示相同的颜色,因为这对您的应用程序和业务非常重要。
答案 2 :(得分:2)
更新:添加了帮助代码示例
我会写一个帮助函数,你可以在视图中调用它来添加正确的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); ?>
答案 3 :(得分:1)
我会把颜色显示在模型中的逻辑(第二种方法)
这并不违反mvc原则。
您真正在做的是在模型中存储票证是否少于6小时或超过6小时。
第二种方法还可以使模板更清晰,从视图中删除表示逻辑,这使得图形设计人员更容易理解视图。
我不是PHP开发人员(所以不能提供代码)但是我会有一个帮助类,它提供了一个静态方法,它接受一个故障单对象从中提取hours_left并将颜色作为字符串返回。
答案 4 :(得分:1)
您应始终努力使您的观点尽可能简洁。这意味着尽可能多地删除PHP并将其推送到控制器,模型甚至帮助器中。
我建议您评估帮助程序中每个故障单剩余的小时数,并使用switch语句返回应该应用于该故障单的空格分隔的类列表。
然后在您看来,它将如此简单:
<? foreach($ticket as $t): ?>
<div class="<?= $t['classes'];?>"><?= $t['name']; ?></div>
<? endforeach; ?>
然后使用CSS来标记类。