陳玉
摘? 要:本文主要研究Joomla系統(tǒng)中模塊的工作原理;文章首先分析模塊的結(jié)構(gòu),然后依次分析模塊中XML文件的工作機(jī)理,接著分析模塊中的入口文件,再接著分析模塊中的helper類文件;最后對模塊的一些特點(diǎn)作了總結(jié)。
關(guān)鍵詞:Joomla;內(nèi)容管理系統(tǒng);Joomla模塊結(jié)構(gòu);Joomla工作原理
中圖分類號:TP311.5?????????? 文獻(xiàn)標(biāo)識碼:A
1?? 引言(Introduction)
隨著網(wǎng)絡(luò)應(yīng)用的快速發(fā)展,內(nèi)容管理系統(tǒng)應(yīng)用而生。相比傳統(tǒng)建站模式,內(nèi)容管理系統(tǒng)具有許多基于模板的優(yōu)秀設(shè)計,可以加快網(wǎng)站的開發(fā)速度及減少開發(fā)成本。內(nèi)容管理系統(tǒng)的基本思想是分離內(nèi)容的管理和設(shè)計,頁面存儲在模板里,而內(nèi)容存儲在獨(dú)立的文件中或數(shù)據(jù)庫中[1]。
2? 國內(nèi)外發(fā)展概況(Developments at home and
abroad)
國外的內(nèi)容管理系統(tǒng)有WordPress、Joomla及Drupal等,這些系統(tǒng)應(yīng)用了非常多的建站新技術(shù),同時每個系統(tǒng)都留有第三方開發(fā)接口,可供二次開發(fā),具有較大的靈活性。國內(nèi)比較有名的內(nèi)容管理系統(tǒng),如Discuz、DedeCMS和PHPWind等,這幾種系統(tǒng)的優(yōu)點(diǎn)是訪問速度快,缺點(diǎn)是系統(tǒng)集成度高,不能完全實(shí)現(xiàn)模塊化,不便于二次開發(fā),擴(kuò)展能力不夠強(qiáng)大。
3? Joomla系統(tǒng)中模塊具體研究分析(The concrete
study of modules)
本文主要對Joomla系統(tǒng)的模塊進(jìn)行分析研究;在Joomla系統(tǒng)中,模塊的典型特點(diǎn)是簡潔、輕量級的,模塊主要是為用戶提供消息和導(dǎo)航選項。針對具體研究實(shí)例,文中以Joomla系統(tǒng)中的最新用戶模塊(Latest user module)進(jìn)行分析研究,最新用戶模塊主要功能是顯示網(wǎng)站新注冊的用戶;同時通過調(diào)節(jié)模塊參數(shù)可以控制顯示的用戶數(shù),也可以顯示用戶相關(guān)介紹及聯(lián)系信息。
模塊的具體文件和文件夾結(jié)構(gòu)見表1。
表1 模塊結(jié)構(gòu)
Tab.1 The structure of modules
文件?描述
tmpl/default.php?布局文件
helper.php?功能文件
mod_users_latest.php?入口文件
mod_users_latest.xml?安裝文件及選項
根據(jù)表中模塊里的各類文件,下面進(jìn)行具體分析。
3.1?? 模塊中的XML文件
模塊里的xml文件主要包括模塊安裝和卸載時所用到的文件及文件夾信息,同時也包括模塊中一些參數(shù)的定義。
<;filename
module="mod_users_latest">;mod_users_latest.php<;/filename>;
<;folder>;tmpl<;/folder>;
<;filename>;helper.php<;/filename>;
<;filename>;index.html<;/filename>;
<;language tag="en- GB">;en- GB.mod_users_latest.ini<;/language>;
<;language tag="en- GB">;en- GB.mod_users_latest.sys.ini<;/language>;
上述代碼主要定義模塊中所用到的相關(guān)文件,而文件夾tmpl下的文件只須定義該文件夾即可;代碼中還定義了兩個語言文件,這兩個語言文件將被安裝到Joomla系統(tǒng)的核心語言文件夾下,而不是安裝到擴(kuò)展語言文件夾下;同時在xml文件中還定義了模塊中參數(shù)的屬性,即三個基本屬性和五個高級屬性,限于篇幅這里在代碼中做了省略[2]。
3.2?? 模塊主入口文件
模塊在運(yùn)行時,需要裝載一個和該模塊文件夾同名的PHP文件,如最新用戶模塊就會裝載modules/mod_users_latest/mod_users_latest.php位置的PHP文件;主入口文件代碼片斷如下:
require_oncedirname(__FILE__).'/helper.php';
$shownumber=$params->;get('shownumber', 5);
$name=moduserslatestHelper::getUsers($params);
$linknames=$params->;get('linknames', 0);
$moduleclass_sfx=htmlspecialchars($params->;
get('moduleclass_sfx'));
requireJModuleHelper::getLayoutPath('mod_users_latest', $params->;get('layout', 'default'));
上述代碼中,require_oncedirname(__FILE__).'/helper.php'語句主要是模塊中需要用到helper類,helper類文件主要是為模塊提供各類方法,模塊的主要處理事宜都集中在helper類中。接下來語句調(diào)用getUsers()方法,并將結(jié)果存儲到變量$linknames中;在這個方法中利用了一個很重要的$params中間變量,該變量在文件中沒有聲明,到底來自哪里?經(jīng)過分析后得知結(jié)果如此:首先在系統(tǒng)JModuleHelper類的renderModule()方法中,有require $path語句,$path變量中存放模塊入口文件的全名(即mod_users_latest.php);其次在PHP中require命令會將所包含文件“粘貼”般的插入當(dāng)前文件,由于mod_users_latest.php是一般腳本,不包含類文件,所以require命令包含的文件內(nèi)容也會被立即執(zhí)行;最后發(fā)現(xiàn),$params在renderModule()里的早些時候已被定義,所以也就找到了$params變量的出處[2]。endprint
再回到上述代碼片斷的$linknames變量,該變量是在執(zhí)行模塊布局的時候用到。下面語句行是取得模塊類后綴選項,模塊類后綴允許開發(fā)者微調(diào)模塊中的CSS文件。最后一行語句是從模塊的參數(shù)中取得布局選項。在上述代碼開始,也可以用Joomla自帶的方法JLoader::register()代替require_once,從而取得更快的執(zhí)行速度。
3.3?? 模塊中的helper類文件
helper類是模塊信息的來源,如下是類中g(shù)etUsers()方法的代碼片斷:
static function getUsers($params)
{
$db=JFactory::getDbo();
$query=$db->;getQuery(true);
$result=$db->;loadObjectList();
return (array) $result;
}
上述代碼中將方法聲明為靜態(tài),這樣可以通過類名調(diào)用。代碼首行定義JDatabase對象$db,在Joomla中可以通過JDatabase對象提取數(shù)據(jù)庫中的數(shù)據(jù),接下來的語句是定義JDatabaseQuery查詢對象,loadObjectList()以數(shù)組形式將各行返回。此外,JDatabaseQuery基本上是SQL聲明形式的一個鏡像,不同于SQL聲明,JDatabaseQuery可以以我們想要的任何順序來書寫,而SQL聲明則必須以正確的順序來書寫。JDatabaseQuery可以很好的支持Microsoft SQL Server和MySQL數(shù)據(jù)庫;當(dāng)使用JDatabaseQuery建立所有的數(shù)據(jù)查詢時,查詢都會在這些數(shù)據(jù)庫中完美運(yùn)行;這些功能主要得益于在各種數(shù)據(jù)庫使用SQL命令時,系統(tǒng)的查詢類具有很好的差異適應(yīng)能力。
3.4?? 模塊中的默認(rèn)布局文件
默認(rèn)布局文件代碼片斷如下:
<;?php if (!empty($names)) : ?>;<;ul class="latestusers<;?php echo $moduleclass_sfx ?>;" >;
<;?phpforeach($names as $name) : ?>;
<;li>;<;?php echo $name->;username; ?>;<;/li>;<;?phpendforeach; ?>;<;/ul>;<;?phpendif; ?>;
代碼片斷中if聲明使用了替換性PHP語法,這種用法一般使用在PHP和HTML混合的布局文件中;在這里if聲明主要來判斷$names是否為空,這樣可以避免在頁面上輸出空元素。
上述代碼中用到了$names變量,$names來自于mod_users_latest.php文件中的$names=moduserslatestHelper::getUsers($params)語句。接下來的部分用到了foreach循環(huán),該循環(huán)是遍歷數(shù)組元素比較方便的方法,$name變量是數(shù)組中的當(dāng)前元素;假如數(shù)組為空,程序?qū)氐滋D(zhuǎn)循環(huán)。同時在代碼中使用echo命令在屬性中插入變量,在插入變量時需要注意空格的重要性,即在latestusers和echo命令返回的變量之間是不能有空格的,否則會出錯。
4?? 結(jié)論(Conclusion)
最后再對上述各部分做一下總結(jié)。首先,模塊和Joomla站點(diǎn)的其余部分是無縫接合的;其次,模塊完全支持多種語言,模塊將根據(jù)所建立的兩個相應(yīng)語言文件自動進(jìn)行顯示;第三,模塊支持替換式布局和模板布局覆蓋,通過使用getLayoutPath()方法來獲得布局文件;第四,模塊允許用戶輸入各類參數(shù)選項來控制模塊的運(yùn)行[3];第五,模塊可以安全防護(hù)各類SQL注入和其他站點(diǎn)攻擊行為;最后,模塊可以做到很好的安裝和卸載,更方便站點(diǎn)的維護(hù)。
參考文獻(xiàn)(References)
[1] 邊霞,等.基于MVC的文件備份后臺管理系統(tǒng)的設(shè)計與實(shí)現(xiàn)
[J].計算機(jī)工程與設(shè)計,2011,32:3195-3198.
[2] 胡建強(qiáng),馬櫻,朱順痣.基于本體的網(wǎng)絡(luò)化軟件需求內(nèi)容管理
系統(tǒng)的研究與實(shí)現(xiàn)[J].計算機(jī)應(yīng)用與軟件,2013,30(12):31-34.
[3] 盛安元,黃存東,張前進(jìn).基于開源軟件Drupal工程實(shí)踐[J].武
漢工業(yè)學(xué)院學(xué)報,2013,31(2):65-67.
作者簡介:
陳? 玉(1975-),男,碩士,中級實(shí)驗師.研究領(lǐng)域:計算機(jī)應(yīng)
用,信息檢索.endprint
再回到上述代碼片斷的$linknames變量,該變量是在執(zhí)行模塊布局的時候用到。下面語句行是取得模塊類后綴選項,模塊類后綴允許開發(fā)者微調(diào)模塊中的CSS文件。最后一行語句是從模塊的參數(shù)中取得布局選項。在上述代碼開始,也可以用Joomla自帶的方法JLoader::register()代替require_once,從而取得更快的執(zhí)行速度。
3.3?? 模塊中的helper類文件
helper類是模塊信息的來源,如下是類中g(shù)etUsers()方法的代碼片斷:
static function getUsers($params)
{
$db=JFactory::getDbo();
$query=$db->;getQuery(true);
$result=$db->;loadObjectList();
return (array) $result;
}
上述代碼中將方法聲明為靜態(tài),這樣可以通過類名調(diào)用。代碼首行定義JDatabase對象$db,在Joomla中可以通過JDatabase對象提取數(shù)據(jù)庫中的數(shù)據(jù),接下來的語句是定義JDatabaseQuery查詢對象,loadObjectList()以數(shù)組形式將各行返回。此外,JDatabaseQuery基本上是SQL聲明形式的一個鏡像,不同于SQL聲明,JDatabaseQuery可以以我們想要的任何順序來書寫,而SQL聲明則必須以正確的順序來書寫。JDatabaseQuery可以很好的支持Microsoft SQL Server和MySQL數(shù)據(jù)庫;當(dāng)使用JDatabaseQuery建立所有的數(shù)據(jù)查詢時,查詢都會在這些數(shù)據(jù)庫中完美運(yùn)行;這些功能主要得益于在各種數(shù)據(jù)庫使用SQL命令時,系統(tǒng)的查詢類具有很好的差異適應(yīng)能力。
3.4?? 模塊中的默認(rèn)布局文件
默認(rèn)布局文件代碼片斷如下:
<;?php if (!empty($names)) : ?>;<;ul class="latestusers<;?php echo $moduleclass_sfx ?>;" >;
<;?phpforeach($names as $name) : ?>;
<;li>;<;?php echo $name->;username; ?>;<;/li>;<;?phpendforeach; ?>;<;/ul>;<;?phpendif; ?>;
代碼片斷中if聲明使用了替換性PHP語法,這種用法一般使用在PHP和HTML混合的布局文件中;在這里if聲明主要來判斷$names是否為空,這樣可以避免在頁面上輸出空元素。
上述代碼中用到了$names變量,$names來自于mod_users_latest.php文件中的$names=moduserslatestHelper::getUsers($params)語句。接下來的部分用到了foreach循環(huán),該循環(huán)是遍歷數(shù)組元素比較方便的方法,$name變量是數(shù)組中的當(dāng)前元素;假如數(shù)組為空,程序?qū)氐滋D(zhuǎn)循環(huán)。同時在代碼中使用echo命令在屬性中插入變量,在插入變量時需要注意空格的重要性,即在latestusers和echo命令返回的變量之間是不能有空格的,否則會出錯。
4?? 結(jié)論(Conclusion)
最后再對上述各部分做一下總結(jié)。首先,模塊和Joomla站點(diǎn)的其余部分是無縫接合的;其次,模塊完全支持多種語言,模塊將根據(jù)所建立的兩個相應(yīng)語言文件自動進(jìn)行顯示;第三,模塊支持替換式布局和模板布局覆蓋,通過使用getLayoutPath()方法來獲得布局文件;第四,模塊允許用戶輸入各類參數(shù)選項來控制模塊的運(yùn)行[3];第五,模塊可以安全防護(hù)各類SQL注入和其他站點(diǎn)攻擊行為;最后,模塊可以做到很好的安裝和卸載,更方便站點(diǎn)的維護(hù)。
參考文獻(xiàn)(References)
[1] 邊霞,等.基于MVC的文件備份后臺管理系統(tǒng)的設(shè)計與實(shí)現(xiàn)
[J].計算機(jī)工程與設(shè)計,2011,32:3195-3198.
[2] 胡建強(qiáng),馬櫻,朱順痣.基于本體的網(wǎng)絡(luò)化軟件需求內(nèi)容管理
系統(tǒng)的研究與實(shí)現(xiàn)[J].計算機(jī)應(yīng)用與軟件,2013,30(12):31-34.
[3] 盛安元,黃存東,張前進(jìn).基于開源軟件Drupal工程實(shí)踐[J].武
漢工業(yè)學(xué)院學(xué)報,2013,31(2):65-67.
作者簡介:
陳? 玉(1975-),男,碩士,中級實(shí)驗師.研究領(lǐng)域:計算機(jī)應(yīng)
用,信息檢索.endprint
再回到上述代碼片斷的$linknames變量,該變量是在執(zhí)行模塊布局的時候用到。下面語句行是取得模塊類后綴選項,模塊類后綴允許開發(fā)者微調(diào)模塊中的CSS文件。最后一行語句是從模塊的參數(shù)中取得布局選項。在上述代碼開始,也可以用Joomla自帶的方法JLoader::register()代替require_once,從而取得更快的執(zhí)行速度。
3.3?? 模塊中的helper類文件
helper類是模塊信息的來源,如下是類中g(shù)etUsers()方法的代碼片斷:
static function getUsers($params)
{
$db=JFactory::getDbo();
$query=$db->;getQuery(true);
$result=$db->;loadObjectList();
return (array) $result;
}
上述代碼中將方法聲明為靜態(tài),這樣可以通過類名調(diào)用。代碼首行定義JDatabase對象$db,在Joomla中可以通過JDatabase對象提取數(shù)據(jù)庫中的數(shù)據(jù),接下來的語句是定義JDatabaseQuery查詢對象,loadObjectList()以數(shù)組形式將各行返回。此外,JDatabaseQuery基本上是SQL聲明形式的一個鏡像,不同于SQL聲明,JDatabaseQuery可以以我們想要的任何順序來書寫,而SQL聲明則必須以正確的順序來書寫。JDatabaseQuery可以很好的支持Microsoft SQL Server和MySQL數(shù)據(jù)庫;當(dāng)使用JDatabaseQuery建立所有的數(shù)據(jù)查詢時,查詢都會在這些數(shù)據(jù)庫中完美運(yùn)行;這些功能主要得益于在各種數(shù)據(jù)庫使用SQL命令時,系統(tǒng)的查詢類具有很好的差異適應(yīng)能力。
3.4?? 模塊中的默認(rèn)布局文件
默認(rèn)布局文件代碼片斷如下:
<;?php if (!empty($names)) : ?>;<;ul class="latestusers<;?php echo $moduleclass_sfx ?>;" >;
<;?phpforeach($names as $name) : ?>;
<;li>;<;?php echo $name->;username; ?>;<;/li>;<;?phpendforeach; ?>;<;/ul>;<;?phpendif; ?>;
代碼片斷中if聲明使用了替換性PHP語法,這種用法一般使用在PHP和HTML混合的布局文件中;在這里if聲明主要來判斷$names是否為空,這樣可以避免在頁面上輸出空元素。
上述代碼中用到了$names變量,$names來自于mod_users_latest.php文件中的$names=moduserslatestHelper::getUsers($params)語句。接下來的部分用到了foreach循環(huán),該循環(huán)是遍歷數(shù)組元素比較方便的方法,$name變量是數(shù)組中的當(dāng)前元素;假如數(shù)組為空,程序?qū)氐滋D(zhuǎn)循環(huán)。同時在代碼中使用echo命令在屬性中插入變量,在插入變量時需要注意空格的重要性,即在latestusers和echo命令返回的變量之間是不能有空格的,否則會出錯。
4?? 結(jié)論(Conclusion)
最后再對上述各部分做一下總結(jié)。首先,模塊和Joomla站點(diǎn)的其余部分是無縫接合的;其次,模塊完全支持多種語言,模塊將根據(jù)所建立的兩個相應(yīng)語言文件自動進(jìn)行顯示;第三,模塊支持替換式布局和模板布局覆蓋,通過使用getLayoutPath()方法來獲得布局文件;第四,模塊允許用戶輸入各類參數(shù)選項來控制模塊的運(yùn)行[3];第五,模塊可以安全防護(hù)各類SQL注入和其他站點(diǎn)攻擊行為;最后,模塊可以做到很好的安裝和卸載,更方便站點(diǎn)的維護(hù)。
參考文獻(xiàn)(References)
[1] 邊霞,等.基于MVC的文件備份后臺管理系統(tǒng)的設(shè)計與實(shí)現(xiàn)
[J].計算機(jī)工程與設(shè)計,2011,32:3195-3198.
[2] 胡建強(qiáng),馬櫻,朱順痣.基于本體的網(wǎng)絡(luò)化軟件需求內(nèi)容管理
系統(tǒng)的研究與實(shí)現(xiàn)[J].計算機(jī)應(yīng)用與軟件,2013,30(12):31-34.
[3] 盛安元,黃存東,張前進(jìn).基于開源軟件Drupal工程實(shí)踐[J].武
漢工業(yè)學(xué)院學(xué)報,2013,31(2):65-67.
作者簡介:
陳? 玉(1975-),男,碩士,中級實(shí)驗師.研究領(lǐng)域:計算機(jī)應(yīng)
用,信息檢索.endprint