[本文轉自:夢溪筆記]
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組件開發。如果你有問題,可以找我一起交流
希望本文能解決你所遇到的問題。
以上就介紹了Joomla中的Task 和view 深入學習,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。