Joomla 路由系統(tǒng)

2023-03-10 16:00 更新

joomla中的路由系統(tǒng)的可以創(chuàng)建SEF(搜索引擎友好)的URL。從 1.5 版開始,Joomla!能夠創(chuàng)建和解析任何格式的URL,包括 SEF URL.這不依賴于 Web 服務(wù)器 URL 重寫功能,只要PHP開始mod_rewrite模塊,即使服務(wù)器類型不是Apache也是可以。SEF URL 遵循一定的固定模式,但用戶可以為 URL 的每個段定義一個簡短的描述性文本(別名)。

一般,SEF URL 的本地部分(域名之后的部分)稱為路由(route)。創(chuàng)建和處理 SEF URL 稱為路由(routing),相關(guān)代碼稱為路由器(router)。

在Joomla中,每一個組件負責(zé)處理自己的SEF URL,如果你是組件開發(fā)者,為了支持SEF URL,你就需要創(chuàng)建自己組件的router.

概念

假設(shè)您遵循標(biāo)準(zhǔn)開發(fā)實踐,你的組件現(xiàn)在使用的是系統(tǒng)的URL模式,類似于

http://www.example.com/index.php?option=com_yourcomponent&view=article&id=1&catid=20&Itemid=50

現(xiàn)在你的目標(biāo)是將這個URL轉(zhuǎn)換為下面的形式:

http://www.example.com/sport/nba-list/team

為了實現(xiàn)這個目標(biāo),作為開發(fā)人員,你現(xiàn)在需要做兩件事:

1,告訴系統(tǒng)你當(dāng)前需要轉(zhuǎn)換的URL鏈接

2,告訴系統(tǒng)如何轉(zhuǎn)換

如何告訴系統(tǒng)當(dāng)前需要轉(zhuǎn)換的URL.

在實際上是非常困難并且低效的讓joomla系統(tǒng)自主計算哪些文本是URL。為此,開發(fā)者在生成URL的時候需要手動的調(diào)用  \Joomla\CMS\Router\Route::_()方法。示例如下:

echo \Joomla\CMS\Router\Route::_('index.php?option=com_yourcomponent&view=article&id=1&catid=20&Itemid=50');

為了方便,開發(fā)者可以省略掉option和Itemid這兩個參數(shù)。option參數(shù)默認為當(dāng)前正在被執(zhí)行組件的名稱,Itemid參數(shù)默認為菜單項的ID.省略后如下:

echo \Joomla\CMS\Router\Route::_('index.php?view=article&id=1&catid=20');

  一般來說,您應(yīng)該只將其應(yīng)用于用戶和/或搜索引擎能夠看到的 URL中,對于系統(tǒng)使用的URL是不需要轉(zhuǎn)換的,比如重定向的URL。

如果用戶在后臺的全局射中關(guān)閉了啟用SEF URLS的選項,\Joomla\CMS\Router\Route::_() 將不會進行轉(zhuǎn)換,直接輸出原始的URL.

寫一個路由器

 下一步,你需要做的就是寫一個路由器。路由器的寫法如下;

1,在組件的根目錄下創(chuàng)建一個router.php的文件。如:/components/com_yourcomponent/router.php

2,編輯router.php文件,在里面定義一個類,類的名稱為[組件的名稱]Router。如(com_content組件則類名為 ContentRouter),并且這個類必須繼承 Joomla\CMS\Component\Router\RouterInterface 。

3,在類中需要實現(xiàn)3個方法,分別是build(&$query),parse($segments),preprocess($query)。

 

 build(&$query) 的功能是 將 URL 參數(shù)數(shù)組轉(zhuǎn)換為將生成 SEF URL 的segment段數(shù)組。轉(zhuǎn)換的工作流程如下:

【原始的URL】 http://www.example.com/index.php?option=com_yourcomponent&view=article&id=1&catid=20&Itemid=50
↓【調(diào)用】 \Joomla\CMS\Router\Route::_
【生成】$query = array('view' => 'article', 'id' => 1, 'catid' => 20)
↓ 【調(diào)用】你組件的路由器 [componentname]Router::build
【生成】$segments = array(20, 1);
↓ 【自動調(diào)用】joomla內(nèi)部的路由系統(tǒng)
【生成】http://www.example.com/example-menu-item/20/1

 

 parse($segments) 的功能是 將 segment(段)數(shù)組參數(shù)數(shù)組轉(zhuǎn)換URL參數(shù) 。轉(zhuǎn)換的工作流程如下:

【原始的URL】http://www.example.com/example-menu-item/20/1
↓ 【自動調(diào)用】Joomla內(nèi)部的路由系統(tǒng)解析
【生成】$segments = array(20, 1);
↓ 【調(diào)用】你組件的路由器 [componentname]Router::parse
【生成】$query = array('view' => 'article', 'id' => 1, 'catid' => 20)
  preprocess($query) 的功能是對URL進行預(yù)處理。無論是否開始SEF URL功能,這個方法都會被調(diào)用。<br><br>

 


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號