2012-09-20 73 views
0

我有一個控制器(用於我的主頁),其中有大約5-6個呈現相同視圖(索引)的動作,因爲用戶可以選擇不同的參數針對不同情況的頁面。每個操作處理每種情況。CakePHP - 如何在這種情況下不違反MVC或DRY

現在我需要在我的主頁上顯示最新消息。看起來很簡單...... 所以我添加

$this->set('fetchednews', $this->News->getLatestNews()); 

到我的索引行動和它的作品,因爲它應該是。

但正如我之前說過的,我對這個頁面有一系列不同的動作和相同的視圖。

因此,如果用戶訪問domain.com,他會看到最新消息,但是如果用戶點擊鏈接,例如

domain.com/mainPageController/sortById/1 

,他沒有看到最新的新聞,因爲

action sortById 

沒有$這個 - >設置( 'fetchednews',$這個 - >新聞中心 - > getLatestNews());

我應該使用的元素,並在元素使用

$news = $this->News->getLatestNews(); 

,然後在索引視圖中使用這個元素?或者我需要重複

$this->set('fetchednews', $this->News->getLatestNews()); 

要添加到我的主頁面控制器的每個動作?

如何正確處理這種情況?

+0

如何使用'beforeFilter',假設所有動作都需要設置'fetchednews'? –

+0

這是一個很好的建議。我現在就試試,謝謝。 – user1327

+0

@MattHuggins謝謝你,這就是我所尋找的。如果你願意,請發表你的建議作爲答案。 – user1327

回答

1

如何使用beforeFilter,假設所有動作都需要t o設置fetchednews

function beforeFilter() { 
    $this->set('fetchednews', $this->News->getLatestNews()); 
} 
+2

你應該使用beforeRender()來設置視圖變量不beforeFilter(); – ADmad

+0

好電話ADman,我忘了CakePHP允許這個。我一直在使用Rails太久了:) –

0

如果我是你,我會將需要共享的所有功能包裝到一個新的方法中,該方法將控制器作爲參數,然後執行常見操作。你仍然需要每個動作所需的消息,但至少你可以修改它/在一個地方添加額外的代碼...

我不熟悉Cake,因爲我傾向於使用CI自己,但像...

function MyAction1() { 
    //Other code 
    $this->CommonCode(); 
} 

function CommonCode() { 
    $this->set('fetchednews', $this->News->getLatestNews()); 
} 

,或者如果你更喜歡移動的功能,你的控制器之外(以避免它被解釋爲行動本身),控制器傳遞到方法...

function MyAction1() { 
    //Other code 
    CommonCode($this); 
} 

//Different class 
function CommonCode($controller) { 
    $controller->set('fetchednews', $this->News->getLatestNews()); 
}