Joomla中的Task 和view 深入學習
[本文轉自:夢溪筆記]
Joomla 是一個優秀的CMS系統,她可以讓你快速的完成一個網站的建設,她提供組件,模組,模板能夠滿足你大部分的網站需求。而組件在其中舉足輕重。
一、基本知識
組件(component ) 用於顯示頁面的主要資料。Joomla的組件採用的是MVC架構設計。 在一個頁面請求產生時,其URL中可能包括task, view, layout等資訊。我在這裡就是要討論這個task和view. 一般URL中如果含有task就不會含有view, 這裡因為joomla認為task就完成一個特定的任務,比如說資料庫操作,有效性驗證等, 而view是負責顯示資料。通常的設計是task裡完成任務處理後,會調用setRedirect方法引導向一個view來顯示資料。其實在joomla裡,如果URL中沒有指定task的話,會預設task為display。
二、問題
在項目中,需要在頁面的meta資料裡包含Open graphic protocol 資料。Open graphic protocol 用於給社交網路提供要分享的資料描述。 如果你的頁面是通過task來完成的,然後 在task裡通過setRedirect根據資料跳轉到不同的view進行授權驗證, 然後驗證通過後顯示資料頁面的話,你可能會遇到這種問題:你需要分享這個頁面,你在這個頁面的meta資料裡添加了Open graphic protocol 資料,你希望分享到facebook, google+等社交網站時,你會發現在分享頁面顯示的資料和圖片並不是你想要顯示頁面的資料。
三、解決方案
上面的問題是因為Open graphic protocol 資料擷取並不支援跳轉,如果遇到跳轉,一般都會去網站首頁拾取資料,而這並不是我們想要的。引起這個問題就是setRedirect。 setRedirect的原理是發送給瀏覽裡的HTML頭中包含了跳轉指令。而解決上面的問題的方法是不使用setRedirect, 而是使用display. 每一個JControllerLegacy都有一個display方法,你只要設定input裡的view, layout, 以及其他你要傳遞過去的資料,然後調用display方法就可。
下面是範例程式碼:
/** * 內部跳轉,用於代替setRedirect. 為什麼要這樣子做呢? * 因為 setRedirect他會發送一個http頭到瀏覽器,讓瀏覽 * 進行跳轉,這樣一來就多了一個網路請問, 這是其一。最 * 為主要的是setRedirect在某些不支援瀏覽器redirect的情況 * 下達不到效果,例如:open graphic protocal * * @param type $view 要顯示的view * @param type $layout 要顯示的layout, 預設為NULL */ protected function internalRedirect($view, $layout=null){ $this->input->set("view", $view); $this->input->set("layout", $layout); return $this->display(); } public function checkAvailable(){ //其他的業務代碼 $this->input->set('tmpl', 'doexam'); return $this->internalRedirect("doexam", $layout); }
上面的代碼是寫在你的Controller裡的。函數internalRedirect通過設定$input(這個input是指url的輸入參數) 中的view, layout,然後直接調用JControllerLegecy的display方法來顯示頁面。
在checkAvailable方法中,在調用internalRedirect之前,還設定了其他 view需要的參數。
夢溪的一個朋友說他在做他的一個網站 時遇到了這樣的問題,我們討論並分析了Joomla的實現代碼,發現其實這個解決挺容易, 只要你熟悉Joomla組件開發。如果你有問題,可以找我一起交流
希望本文能夠解決你所遇到的問題。