繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM