2011-05-27 107 views
1

我是新來的MVC和PHP框架,所以請原諒我這個簡單的問題...大切換視圖

我喜歡我的看法,並沒有PHP代碼的很大一部分,但我有一個案例我真的不知道如何正確地做到這一點。

基本上一些對象有20多種不同的狀態,狀態由模型給出。 現在我有一個:

switch($object->getState()) 
{ 
    case 0: 
    $sText = '...'; 
    break; 
    case 1: 
    $sText = '... on the'.$object->getDate(); 
    break; 
    ... 
    case 20: 
    $sText = '...'; 
    break; 
} 
?> 
<img src="<?echo $object->getState()?>.png" alt = "<?echo $sText;?>" 
title = "<?echo $sText;?>" /> 

我怎麼能做到這一點,而不在視圖中40+線PHP的?我不想重複<img>標籤20次。對我來說,文本應該屬於視圖而不是模型。

也許一個視圖助手將文本分配給狀態?

回答

4

視圖助手不會讓你的代碼更少模糊或更好的MVC。視圖文本可能不屬於模型,但確定文本的邏輯絕對不屬於視圖。編寫一個像$model->getViewTextForState($object->getState())這樣的方法沒有什麼不妥 - 這與你用於多種語言的字符串本地化的方法基本相同。

想想這樣 - 視圖的alt文本確實屬於模型,因爲模型負責編組所有數據。如果視圖中的某些文本是可變的,那麼它實際上就是模型數據,就像您從$object->getState()方法生成的圖像名稱一樣。圖像名稱和alt文本它的數據,應以單線路接入方法

1

提供給視圖從模型的開關可以在你的行動,你可以使用翻譯字符串這樣

$this->sText = 'object_state_' . $object->getState() 

然後在你的觀點中,翻譯$ sText會做伎倆。

+0

事實上,但在我的情況下,一些文本將有參數。例如「未打開」和「打開....」這使事情變得複雜。 – 2011-05-27 16:52:09

+0

只需創建另一個變量來處理參數,並在您的動作中添加一個開關以填充它。 – greg0ire 2011-05-27 16:54:03

+0

替代文本具有參數的事實更強烈地向我表明,模型的責任是追蹤。只有模型知道是否<?echo $ object-> getState()?>。png'已經或尚未打開。 – 2011-05-27 17:18:39