MVC:“显示颜色”逻辑应该在视图还是模型中?

时间:2012-02-08 11:50:05

标签: php model-view-controller codeigniter

我正在编写一个带有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原则。

应该在哪里放置颜色逻辑?

5 个答案:

答案 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来标记类。