2012-02-08 52 views
1

我正在使用CodeIgniter编程票务管理系统,而且我有一个MVC困境,无论条件着色是在模型中还是在视图中? 视图应显示网格中的所有票证。 假设票据有截止日期时间。在还剩不到一个小时的时候,票应该用红色着色,当还剩一个到六个小时的时候,票应该用黄色着色,而当剩下六个多小时时,票应该着色绿色。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原则。

颜色逻辑应放在哪里?

回答

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); ?> 
+0

是否有可能将该助手作为Ticket_model的方法编写?例如:$ ticket-> get_color()? CI可以吗? – 2012-02-08 12:28:41

+0

是的,更新了答案。 – Rooneyl 2012-02-08 12:51:44

1

我会把颜色模型(第二种方法)来显示逻辑

这个心不是真的要对MVC原则。

您真正在做的是在模型中存储票证是否少于6小时或超过6小时。

第二种方法还可以让您的模板更清晰,从视图中移除表示逻辑,这使得平面设计人员更容易理解视图。我不是一个PHP开发人员(所以不能提供代码),但我会有一个助手类,它提供了一个静态方法,它接受一个票据对象,从中提取hours_left并将其作为字符串返回。

3

我不担心颜色。与一些业务含义而是去确定在模型(或进一步下跌,如果适用):

时间< 1:期限迫近

时间1 - 6:截止中等

时间> 6:最后期限 - 好吧

或者任何有意义的东西。然后,将它作为班级,让你随心所欲地选择颜色和其他样式。

3

颜色在这种情况下是一个视图问题,最有可能甚至更远的CSS。

另外的一票的“状态”是模型的信息。门票从正常到严重到紧急的地方都有一个门槛。所以给与票证数据:根据票状态是否也是一个对象

$ticket['status']='severe'; 

$ticket['status']=$ticketStatusObject 

在这个模型中获得的视图,而那里你可以申请逻辑结束。使语义比如像:

<div class="ticket severe"> 

<div class="ticket" status="severe"> 

和关闭过程中的CSS,你格式化。

现在有一个有趣的概念,这是很难与MVC。颜色是视图,这是最基本的真实。但它也可能是商业目的。就像路灯变成绿色 - 橙红色。在这种情况下,我会加载模型中的颜色(TicketStatusObject)。您仍然可以将它们放入CSS中,但会基于该模型生成CSS,因为它会影响业务。

如果你创建另一个视图层,就像一个移动应用程序,它会使用相同的模型,并显示出相同的颜色,因为这是为你的应用和业务的重要。

1

您应该始终努力使自己的观点尽可能简洁。这意味着要尽可能多地删除PHP,并将其推送到您的控制器,模型或甚至帮助程序中。

我建议你评估一个助手留下每票的时间和使用switch语句返回的应该应用到票据类空格分隔列表。

然后在你看来,这将是简单:

<? foreach($ticket as $t): ?> 
<div class="<?= $t['classes'];?>"><?= $t['name']; ?></div> 
<? endforeach; ?> 

然后用CSS来标记的类。

相关问题