[本文轉自:夢溪筆記]
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組件開發。如果你有問題,可以找我一起交流
希望本文能夠解決你所遇到的問題。