2012-02-08 29 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來標記的類。

相關問題