[本文轉(zhuǎn)自:夢溪筆記]

Joomla是一個(gè)優(yōu)秀的CMS系統(tǒng),她可以讓你快速的完成一個(gè)網(wǎng)站的建設(shè),她提供組件,模塊,模板能夠滿足你大部分的網(wǎng)站需求。而組件在其中舉足輕重。
一、基本知識組件(component ) 用于顯示頁面的主要數(shù)據(jù)。Joomla的組件采用的是MVC架構(gòu)設(shè)計(jì)。 在一個(gè)頁面請求產(chǎn)生時(shí),其URL中可能包括task, view, layout等信息。我在這里就是要討論這個(gè)task和view. 一般URL中如果含有task就不會(huì)含有view, 這里因?yàn)閖oomla認(rèn)為task就完成一個(gè)特定的任務(wù),比如說數(shù)據(jù)庫操作,有效性驗(yàn)證等, 而view是負(fù)責(zé)顯示數(shù)據(jù)。通常的設(shè)計(jì)是task里完成任務(wù)處理后,會(huì)調(diào)用setRedirect方法引導(dǎo)向一個(gè)view來顯示數(shù)據(jù)。其實(shí)在joomla里,如果URL中沒有指定task的話,會(huì)默認(rèn)task為display。
二、問題
在項(xiàng)目中,需要在頁面的meta數(shù)據(jù)里包含Open graphic PRotocol數(shù)據(jù)。Open graphic protocol 用于給社交網(wǎng)絡(luò)提供要分享的數(shù)據(jù)描述。 如果你的頁面是通過task來完成的,然后 在task里通過setRedirect根據(jù)數(shù)據(jù)跳轉(zhuǎn)到不同的view進(jìn)行授權(quán)驗(yàn)證, 然后驗(yàn)證通過后顯示數(shù)據(jù)頁面的話,你可能會(huì)遇到這種問題:你需要分享這個(gè)頁面,你在這個(gè)頁面的meta數(shù)據(jù)里添加了Open graphic protocol 數(shù)據(jù),你希望分享到facebook, google+等社交網(wǎng)站時(shí),你會(huì)發(fā)現(xiàn)在分享頁面顯示的數(shù)據(jù)和圖片并不是你想要顯示頁面的數(shù)據(jù)。
三、解決方案
上面的問題是因?yàn)镺pen graphic protocol 數(shù)據(jù)獲取并不支持跳轉(zhuǎn),如果遇到跳轉(zhuǎn),一般都會(huì)去網(wǎng)站首頁拾取數(shù)據(jù),而這并不是我們想要的。引起這個(gè)問題就是setRedirect。 setRedirect的原理是發(fā)送給瀏覽里的HTML頭中包含了跳轉(zhuǎn)指令。而解決上面的問題的方法是不使用setRedirect, 而是使用display. 每一個(gè)JControllerLegacy都有一個(gè)display方法,你只要設(shè)置input里的view, layout, 以及其他你要傳遞過去的數(shù)據(jù),然后調(diào)用display方法就可。
下面是示例代碼:
/** * 內(nèi)部跳轉(zhuǎn),用于代替setRedirect. 為什么要這樣子做呢? * 因?yàn)?setRedirect他會(huì)發(fā)送一個(gè)http頭到瀏覽器,讓瀏覽 * 進(jìn)行跳轉(zhuǎn),這樣一來就多了一個(gè)網(wǎng)絡(luò)請問, 這是其一。最 * 為主要的是setRedirect在某些不支持瀏覽器redirect的情況 * 下達(dá)不到效果,例如:open graphic protocal * * @param type $view 要顯示的view * @param type $layout 要顯示的layout, 默認(rèn)為NULL */ protected function internalRedirect($view, $layout=null){ $this->input->set("view", $view); $this->input->set("layout", $layout); return $this->display(); } public function checkAvailable(){ //其他的業(yè)務(wù)代碼 $this->input->set('tmpl', 'doexam'); return $this->internalRedirect("doexam", $layout); }上面的代碼是寫在你的Controller里的。函數(shù)internalRedirect通過設(shè)置$input(這個(gè)input是指url的輸入?yún)?shù)) 中的view, layout,然后直接調(diào)用JControllerLegecy的display方法來顯示頁面。
在checkAvailable方法中,在調(diào)用internalRedirect之前,還設(shè)置了其他 view需要的參數(shù)。
夢溪的一個(gè)朋友說他在做他的一個(gè)網(wǎng)站時(shí)遇到了這樣的問題,我們討論并分析了Joomla的實(shí)現(xiàn)代碼,發(fā)現(xiàn)其實(shí)這個(gè)解決挺容易, 只要你熟悉Joomla組件開發(fā)。如果你有問題,可以找我一起交流
希望本文能夠解決你所遇到的問題。
新聞熱點(diǎn)
疑難解答
圖片精選