用户名 密码 记住我 还未注册?

文章管理 - XOOPS2模組开发

文章管理 :: Xoops 模块 :: 模块开发

XOOPS2模組开发


作者:模块站bkhorse
XOOPS2模組开发
【原版】 下面有我翻译的【简体中文版】

1 前言

覺得XOOPS2的模組不夠多嗎?沒關係!咱們就自己動手來寫。不過在進入本單元之前,您可能得有個心理準備,因為XOOPS2的程式模組大概是所有CMS中最麻煩的了!並不是程式難寫,而是您必須符合XOOPS2繁瑣的模組架構,此模組才跑得起來。不過,也別太擔心,本文會一步一步的帶您探索XOOPS2的模組架構,那您輕鬆的搞定XOOPS2模組喔!

2 在區塊中寫程式

假設您實在厭煩龐雜的XOOPS2的模組架構,但您會寫些PHP程式,那麼,這個方法相當適合您,您只要在區塊中寫下您的PHP程式即可,而無須理會那些模組規則,底下我們用一個簡單的例子來說明。

請進入管理介面,然後到區塊管理中,在下方有新增區塊的介面,您只要在「內容」的地方填入PHP程式碼即可。記得!不需要輸入「」這類的脫逸符號,換言之,整個內容都必須是PHP程式碼,若需要秀出文字或HTML語法,只要用 echo 即可。例如:

Open in new window
圖 1. 在區塊中寫PHP程式


最下方的「內容形式」記得選擇「PHP語言」,並設定好區塊的標題以及要出現在什麼地方,其結果看起來就會像圖 2所示,完全呈現出我們在區塊中所寫的PHP程式之結果。

Open in new window

圖 2. 中間區塊就是PHP程式的執行結果



當然,這個範例是相當基礎的,只是單純的去抓日期以及環境變數,然後將變數值列印出來而已。此範例的重點並不在於PHP要寫些什麼,而是您只要知道在區塊中也是可以執行PHP程式即可,您甚至可以在區塊中連結資料庫,然後把擷取出的資料整理之後秀出亦可,如何運用就看您囉!

2-1 在區塊中連結資料庫
如果要使用XOOPS的資料庫物件,您可以在區塊中這樣寫:

$xoopsDB 
=& Database::getInstance();
$sql="select count(*) from ".$xoopsDB->prefix("users");
$result $xoopsDB->query($sql) ;
list(
$count)=$xoopsDB->fetchRow($result);
echo 
"會員人數:".$count;



重點在這一行:

$xoopsDB 
=& Database::getInstance();


建立一個XOOPS的資料庫物件。

$sql
="select count(*) from ".$xoopsDB->prefix("users");


這一句是 SQL 語法,白話文就是:請從 users 這個表找出所有資料數。user 是會員資料表,所有資料數就是會員人數,換言之,這是一找出所有會員數的寫法。

$xoopsDB->prefix("users") 就是要去呼叫 users 這個資料表,由於 XOOPS 的資料表有所謂的前置字元,例如 users 在資料庫實際為 xoops_user(xoops_即為前置字元),用 $xoopsDB->prefix("資料表") 就會自動幫您加入前置字元。

$result 
$xoopsDB->query($sql) ;


執行 SQL 語法

list($count)=$xoopsDB->fetchRow($result);


利用 $xoopsDB->fetchRow 將執行結果讀出來,然後利用 list() 將讀出的陣列放到變數中,由於我們只請求一項資料(count(*)),所以list 只放到一個變數中,如果請求三項資料,那麼應為 list($var1,$var2,$var3)。

echo "會員人數:".$count;


列印出區快要顯示的結果。



3 XOOPS2模組的靈魂xoops_version.php

以上是一個在 XOOPS2 中使用 PHP 最簡單的方法,但接著,我們要開始進入棘手的部分了!本文以建立一個簡單的通訊錄為範例,示範整個模組開發的流程,只要流程熟悉了,那麼,開發模組就簡單了!

首先,您得知道的是,XOOPS2 的所有模組都放在「XOOPS安裝目錄\modules」底下,換言之, modules 目錄下的每一個目錄都是一個模組。因此,我們要建立一個新模組,第一步就是先在 modules 目錄下建立一個新目錄。本例在 modules 目錄下建立一個名為 my_phonebook 的目錄,文後一律稱之為「模組目錄」。

XOOPS2 的模組可大可小,但有幾個目錄及檔案是一定要有的,我們先來認識一下最重要的一個檔案就是 xoops_version.php。這一個檔案是模組的設定檔,掌管著模組的大小資訊,同時也是和 XOOPS2 系統溝通的重要管道,小從模組名稱設定,大到該模組是否需要選單、區塊、樣版、管理介面...等,通通要在裡頭設定。因此,本文從頭到尾這個檔您會常常看到。

每個模組一定都會有一個 xoops_version.php,而且內容都很長!看起來似乎相當複雜,其實,若是一步一步來看,您會發現:原來並不複雜嘛!OK!您可以在您的xoops_version.php 檔中輸入以下內容:
<?php
$modversion
['name'] = "我的電話簿";        //模組名稱
$modversion['version'] = 0.01;            //模組版本
$modversion['description'] = "簡易的電話簿程式";    //模組描述
$modversion['credits'] = "tad";            //模組著作權人
$modversion['author'] = "tad";            //模組作者
$modversion['license'] = "GPL see LICENSE";    //模組版權
$modversion['image'] = "images/logo.png";    //模組圖示
$modversion['dirname'] = "my_phonebook";    //模組目錄名稱
?>



內容中,最重要的是 $modversion['dirname'] 必須填入該模組的目錄的名稱,填錯了模組可是不能動的!其餘的部分,只要是等號(=)後面的,您都可以自行修改。至於圖檔,沒放也無所謂,不過,建議您還是設計個圖檔,並且依據您的設定值,建立相關的目錄及檔案,以上面的設定為例,我們還必須在您的模組目錄下建立一個 images 的目錄,並且放置一個名為 logo.png 的圖檔,以作為模組圖示。

輸入完之後,進入管理介面的模組管理中,您就會發現,可以安裝的模組中,已經多了一個叫做「我的電話簿」的模組,點選安裝也真的可以安裝喔!不過,目前空空如也,所以,並沒有安裝的必要。

Open in new window

圖 1. 已經出現在模組管理中囉!



4 資料表設定

大部分的模組都會用到資料庫的資料表,若是您的模組不需要,那麼這部分可以略過。如果需要資料表,那麼您必須在 xoops_version.php 加入資料表的相關設定:

$modversion
['sqlfile']['mysql'] = "sql/mysql.sql";    //資料表檔案
$modversion['tables'][0] = "phone";            //表格名稱



$modversion['sqlfile']['mysql']是設定安裝模組時,要匯入資料庫的資料表結構檔案的位置。mysql.sql 的內容可以自行撰寫,檔名也可以自己取,檔案中一次可以放好幾個資料表,您也可以利用 phpMyAdmin 去新增資料表,然後利用輸出功能把資料表的架構輸出存檔,這樣是比較方便的作法。我們在模組目錄下建立一個 sql 目錄,其中放置 mysql.sql,其內容為:

CREATE TABLE 
`phone ` (
    `
snsmallint(5unsigned NOT NULL auto_increment,
    `
namevarchar(40NOT NULL default "",
    `
telvarchar(10NOT NULL default "",
    
PRIMARY KEY (`sn`)
) ;



另外,$modversion['tables'][\n]則是設定 mysql.sql 中的資料表名稱,此名稱必須和 mysql.sql 中的資料表名稱相符。若是同時有數個資料表,那麼 n 可以從 0 開始依序遞增即可。

5 模組管理介面設定

您的模組需要管理介面嗎?如果需要,那麼您必須在 xoops_version.php 加入:

$modversion
['hasAdmin']        = 1;        //是否有管理介面
$modversion['adminindex']    = "admin/index.php";    //管理介面的首頁位置
$modversion['adminmenu']    = "admin/menu.php";    //管理介面的選單程式


若您想替該模組加個管理介面,$modversion['hasAdmin'] 必須設定成 1,若不需要,設成 0 即可。

$modversion['adminindex']是設定主要管理程式的位置,通常會放在 admin 目錄中,因此必須建立一個 admin 目錄,並產生一個 index.php 檔以作為管理程式的主檔案。

和index.php息息相關的是 $modversion['adminmenu'] 設定,它是設定當滑鼠移到模組圖示上時,所出現的浮動選單的內容檔案,通常命名為 menu.php。當使用者點選 menu.php 中的選項時,系統會將執行命令傳給 menu.php 中所設定的 $adminmenu[\n]['link'] 位置,而此位置通常就是 $modversion['adminmenu']的所在位置。

menu.php 的內容兩兩為一組,包含指令名稱 ($adminmenu[\n]['title']) 以及指令的執行連結 ($adminmenu[\n]['link']),原則上可以無限多組,例如選單中希望有 10 個執行指令,那麼,n 就可以從 1 編到 10。我們只要在選單中放兩個功能,所以只有兩組設定,menu.php 內容看起來就像這樣:
<?php
$adminmenu
[1]['title'] ="新增電話";
$adminmenu[1]['link'] = "admin/index.php?op=Add";
$adminmenu[2]['title'] = "刪除電話";
$adminmenu[2]['link'] = "admin/index.php?op=Del";
?>


6 管理介面的index.php

從選單內容來看可以知道,我們設定了兩個功能,分別為新增和刪除,這兩個功能必須靠 index.php 來執行,因此,我們在 index.php 中就必須做出這兩個功能出來。本例的 index.php 內容如下:
<?php 
include '../../../include/cp_header.php'

//新增一筆電話資料 
function add_phone(){ 
    global 
$xoopsDB
    
$sql_insert "insert into ".$xoopsDB->prefix("phone")." (sn,name,tel) values ('$_POST[sn]','$_POST[name]','$_POST[tel]')"
    
$xoopsDB->query($sql_insert) or redirect_header($_SERVER['PHP_SELF'], 10,"執行錯誤"); 


//刪除一筆電話資料 
function del_phone(){ 
    global 
$xoopsDB
    
$sql_delete "delete from ".$xoopsDB->prefix("phone")." where sn=$_GET[sn]"
    
$xoopsDB->queryF($sql_delete) or redirect_header($_SERVER['PHP_SELF'], 10,"執行錯誤"); 


//電話一覽表 
function list_phone(){ 
    global 
$xoopsDB
    
$allData=
    <form action='"
.$_SERVER['PHP_SELF']."' method=post>
    <table border=1> 
    <tr> 
    <td><input type='text' name='name'></td> 
    <td><input type='text' name='tel'></td> 
    <td><input type='hidden' name='op' value='Add'> 
    <input type='submit' value='新增'></td> 
    </tr>"


    
$sql_select="select * from ".$xoopsDB->prefix("phone"); 
    
$result $xoopsDB->query($sql_select) or redirect_header($_SERVER['PHP_SELF'], 10,"執行錯誤");
    while (list(
$sn,$name,$tel)=$xoopsDB->fetchRow($result)){ 
        
$allData.="<tr><td>$name</td><td>$tel</td><td><a href='".$_SERVER['PHP_SELF']."?op=Del&sn=$sn'>刪除</a></td> </tr>"
    } 
    
$allData.="</table></form>"
    return 
$allData




switch(
$_REQUEST['op']){ 
    case 
"Add"
    
add_phone(); 
    
header("location: ".$_SERVER['PHP_SELF']); 
    break; 
    
    case 
"Del"
    
del_phone(); 
    
header("location: ".$_SERVER['PHP_SELF']); 
    break; 

    default: 
    
$main=list_phone(); 
    break; 


xoops_cp_header(); 
echo 
"我的電話簿管理介面"
echo 
$main
xoops_cp_footer(); 
?>



看起來似乎很常很複雜,其實,撇開PHP的部分不說,僅說 XOOPS2 的模組規則,那到還蠻簡單的。

第一行的「include '../../../include/cp_header.php'; 」是一定要加的,該程式算是一個中介程式,讓您的模組與系統接軌用的,所以相當重要。此外,最後的「xoops_cp_header();」是管理頁的頁首檔,而「xoops_cp_footer();」是管理頁的頁尾檔,這兩個檔可以讓您的模組看起來像是嵌在 XOOPS2 的管理介面中一樣。其餘的部分您可以自行發揮!

以本例而言,index.php 所負責的就是新增和刪除資料,因此,裡頭包含三個主要函數,分別為用來進行新增、刪除以及列表。若您的函數中會用到資料庫,那麼記得宣告「global $xoopsDB;」,以便讓函數內部也可以取得資料庫設定。

另外,當您要呼叫資料表時,請用「$xoopsDB->prefix("資料表名稱")」的方式來呼叫,因為 XOOPS2 會自動替每一個資料表加上前置字元,原先您的表叫做「phone」的話,安裝到 XOOPS2 中,可能會變成「xoops_phone」,若直接呼教會很容易出錯,因為前置字元是可以隨使用者高興而隨便訂的!因此,用「$xoopsDB->prefix("資料表名稱")」這種方式,他會自動幫您判斷前置字元為何,以確保能夠正確的找到資料表。

在送出 SQL 請求的時候,您可以用 XOOPS2 內建的資料庫物件來操作,例如:「$xoopsDB->query(SQL語法)」,若是您的 SQL 語法是要刪除或修改,請用「$xoopsDB->queryF(SQL語法)」來進行。

若是語法執行失敗,XOOPS2 通常會出現一個警告畫面,然後轉到某一頁去,這樣的功能用「redirect_header("欲導向的位置","顯示的時間","畫面訊息"); 」即可做到。

其餘的部分均是 PHP 的程式碼,只要稍具 PHP 程式撰寫能力,應該相當容易懂。

7 模組主程式

管理介面做好了之後,現在要來做的就是給使用者看的畫面,亦即模組的主程式。模組的主程式請命名為 index.php,並放置在模組目錄的根目錄下。

以本例而言,我們從資料庫中讀取所有的電話簿資料,然後秀出給使用者觀看,所以整個程式很簡單,只要把資料給抓出來並秀出即可。
<?php 
include '../../mainfile.php'
include 
XOOPS_ROOT_PATH.'/header.php'

$sql_select="select * from ".$xoopsDB->prefix("phone"); 
$result $xoopsDB->query($sql_select) or redirect_header($_SERVER['PHP_SELF'], 10,"執行錯誤"); 
while (list(
$sn,$name,$tel)=$xoopsDB->fetchRow($result)){ 
    
$data.=

·  $name : $tel"


echo 
"<h2>我的電話簿</h2> 


$data

"

include 
XOOPS_ROOT_PATH.'/footer.php'
?>


「include '../../mainfile.php'; 」是引入 XOOPS2 主要設定檔,非常重要,一定要引入的,比較大型的模組可能會將之放在 header.php 中,供其他程式引入。

「include XOOPS_ROOT_PATH.'/header.php';」是 XOOPS2 的網頁頁首檔,「include XOOPS_ROOT_PATH.'/footer.php'; 」則是 XOOPS2 的網頁頁尾檔,利用這兩個檔案將您的程式包起來,可以讓您的模組看起來像是嵌在 XOOPS2 裡面一樣。

另外,為了讓使用者能夠在選單上點選該模組功能,我們必須在 xoops_version.php 加入:

$modversion
['hasMain'] = 1;    //是否加入主選單



這樣最基本的模組就大功告成了!

8 安裝模組

做到這裡,最簡單的模組已經出爐了!您可以將模組上傳,並開始進入管理介面中的模組管理來進行安裝!

Open in new window

圖 2. 模組安裝畫面



安裝後,您就會看到您的管理區多了一個模組的管理圖示,而且,選單中也會有內容喔!點進去就可以進到管理主程式去新增內容囉!
Open in new window

圖 1. 管理畫面


新增內容後,回到首頁就可以看到選單上也出現了模組名稱,點進去便可以看到主要畫面了!
Open in new window

以上是最陽春,但算是小而美的模組。不過,此模組的版面目前得靠修改程式才能作改變,如此,太埋沒 XOOPS2 強大的樣版功能了,所以接著我們就來看看如何將程式與版面分開來!

9 模組樣版設定

每一個模組都可以有許多支程式,而每一支程式都可以搭配一個樣版檔,樣版檔可以讓使用者在不動到主程式的情形下,更改網頁呈現的外觀。樣版檔通常是 HTML 檔,可有可無,端視您的開發需求。如果需要,那麼您必須在 xoops_version.php 加入:

$modversion
['templates'][1]['file'] = 'phone.html';        //模組樣版檔
$modversion['templates'][1]['description'] = "電話簿的樣版檔";    //樣版檔描述



這也是兩個為一組:

$modversion
['templates'][n]['file'是設定樣版檔案名稱;

$modversion
['templates'][n]['description'則是設定該樣版的描述。

要特別注意的是,模組的樣版檔一律放在 templates 目錄下,因此,您必須先在您的模組目錄下建立一個名為 templates 的目錄,然後依照您的設定,放置相關的檔案,如:phone.html。

樣版檔一定要和某一個程式配合才有意義,亦即程式來負責運算及輸出內容,樣版檔則專心負責版面呈現。以本例而言,我們希望我們的模組主程式 index.php 來搭配 phone.html 樣版檔,故我們得先改造一下 index.php 的內容,好讓程式得以輸出樣版變數:
<?php 
include '../../mainfile.php'
$xoopsOption['template_main'] = 'phone.html'
include 
XOOPS_ROOT_PATH.'/header.php'
$xoopsTpl->assign('lang_title'"我的電話簿"); 

$sql_select="select * from ".$xoopsDB->prefix("phone"); 
$result $xoopsDB->query($sql_select) or redirect_header($_SERVER['PHP_SELF'], 10,"執行錯誤");

while (list(
$sn,$name,$tel)=$xoopsDB->fetchRow($result)){ 
    
$data.=

·  $name : $tel"



$alldata=


$data

"

$xoopsTpl->assign('show_tel'$alldata); 

include 
XOOPS_ROOT_PATH.'/footer.php'
?>



其中「$xoopsOption['template_main'] = 'phone.html';」就是告知該程式引用樣版檔的動作,此樣版檔需和 xoops_version.php 中的樣版檔設定一致。

「$xoopsTpl
->assign('lang_title'"我的電話簿"); 」和「$xoopsTpl->assign('show_tel'$alldata); 」都是產生樣版變數的動作,屆時會有 lang_title 及 show_tel 兩個樣版變數傳給樣版檔。其用法很簡單:「$xoopsTpl->assign('變數名稱'"變數值");」即可。

phone.html 接收兩個變數,分別為「$lang_title」及「$show_tel」,因此只要利用 <{}> 符號將該變數包起來,然後就任您怎麼編排了!讀取後,顯示畫面就會如您編排的位置以及效果來呈現,其內容看起來如下:

<h2 style="color:blue"><{$lang_title}></h2>
以下是本電話簿目前所收收錄的電話:<br>
<{
$show_tel}>



由於我們修改了 xoops_version.php 設定,因此,您必須到管理介面中的管理模組來把該模組「更新」,如此,XOOPS2 才會得到新的設定值,您也才能看到正確的效果喔!
Open in new window

圖 1. 程式已經套用樣版檔了



有了樣版檔以後,日後若想改變模組的呈現外觀,您就可以不用去動到程式本身了!您只要修改樣版檔即可,很方便吧!至於以上介紹的樣版使用方法,其實只是九年之一毛,XOOPS2 使用 smarty 樣版引擎,其功能非常多,有興趣的讀者可以至 http://smarty.php.net 去瞧瞧喔!

10 目前整個的檔案結構

最後,整理一下目前整個的檔案結構,以便讓您對整個模組架構有所認識:
Open in new window

圖 1. XOOPS2模組結構精簡版

11 結語

常常有人會問:「為什麼沒有專門在如何寫 XOOPS2 模組的書?」有沒有書在介紹這個,在下並不清楚。不過,其實只要具備 PHP+MySQL 的程式撰寫能力,那就沒有什麼模組寫不出來了,XOOPS2 繁瑣的模組架構只要花點心思及時間便可瞭解,因此,若想開發 XOOPS2 模組,真正要下功夫的是寫 PHP+MySQL 的能力,而非僅依賴對 XOOPS2 模組架構的瞭解。

這次介紹的是 XOOPS2 模組開發的基本步驟,限於時間的關係,還有許多模組的相關功能還未說明,例如如何加上區塊、評論、搜尋,如何設定系統變數以方便使用者調整以及如何設定不同語系...等,不過,這些都是比較進階的動作了,步驟也相對的比較繁瑣複雜,有機會的話,日後再來說明囉!
<< Xoops wiki 资料 模块开发图例说明 - 中级(1) >>
跟踪网址
  • 文章地址: http://xoops.org.cn/modules/article/view.article.php/c15/68
  • 跟踪地址: http://xoops.org.cn/modules/article/trackback.php/68
API: 工具箱 短消息 Email PDF 书签 打印 | RSS | RDF | ATOM
Copyright© ncnynl & XOOPS CHINA
网友个人意见,不代表本站立场。对于发言内容,由发表者自负责任。
发表者 树状展开