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

xoops模组开发手册(繁体中文转简体中文)-1/11 [技术论坛 - 模块使用]

XOOPS China 讨论区 > XOOPS Module (模块) > 模块使用 > xoops模组开发手册(繁体中文转简体中文)-1/11

正在浏览:   1 名游客



 到底部   前一个主题   下一个主题  [无发表权] 请登录或者注册

(1) 2 3 »


xoops模组开发手册(繁体中文转简体中文)-1/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
最近在http://xoops.tnc.edu.tw/modules/tadbook2/view.php?book_sn=1&bdsn=1 看到一份关于模组开发的文本,但是本人不太喜欢看繁体,所以将其转为简体,并且将其中部分名词术语转为大陆常用术语,权当为xoops出点力。
1 前言
[color=000000]觉得XOOPS2的模块不够多吗?没关系!咱们就自己动手来写。不过在进入本单元之前,您可能得有个心理准备,因为XOOPS2的程序模块大概是所有 CMS中最麻烦的了!并不是程序难写,而是您必须符合XOOPS2繁琐的模块架构,此模块才运行得起来。不过,也别太担心,本文会一步一步的带您探索 XOOPS2的模块架构,那您轻松的搞定XOOPS2模块

2005/4/9 10:12
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


xoops模组开发手册(繁体中文转简体中文)-2/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
2 在区块中写程序
假设您实在厌烦庞杂的XOOPS2的模块架构,但您会写些PHP程序,那么,这个方法相当适合您,您只要在区块中写下您的PHP程序即可,而无须理会那些模块规则,下面我们用一个简单的例子来说明。

请进入管理区,然后到区块显示安排中,在下方有添加区块的界面,您只要在「内容」的地方填入PHP程序代码即可。记得!不需要输入「<?php」或「? >」这类的符号,换言之,整个内容都必须是PHP程序代码,若需要显示出文字或HTML语法,只要用 echo 即可。例如:
Open in new window
图 1. 在区块中写PHP程序
最下方的「内容形式」记得选择「PHP语言」,并设定好区块的标题以及要出现在什么地方,其结果看起来就会像图 2所示,完全呈现出我们在区块中所写的PHP程序之结果。
Open in new window
图 2. 中间区块就是PHP程序的执行结果

当然,这个范例是相当基础的,只是单纯的去抓日期以及环境变量,然后将变量值打印出来而已。此范例的重点并不在于PHP要写些什么,而是您只要知道在区块 中也是可以执行PHP程序即可,您甚至可以在区块中连结数据库,然后把撷取出的资料整理之后显示出亦可,如何运用就看您啰!

2005/4/9 10:27
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


xoops模组开发手册(繁体中文转简体中文)-3/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
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;

打印出区快要显示的结果。

2005/4/9 10:39
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


xoops模组开发手册(繁体中文转简体中文)-4/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
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. 已经出现在模块管理中啰!

2005/4/9 10:51
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


Re: xoops模组开发手册(繁体中文转简体中文)-4/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
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 ` (
`sn` smallint(5) unsigned NOT NULL auto_increment,
`name` varchar(40) NOT NULL default "",
`tel` varchar(10) NOT NULL default "",
PRIMARY KEY (`sn`)) ;

另外,$modversion['tables'][n]则是设定 mysql.sql 中的资料表名称,此名称必须和 mysql.sql 中的资料表名称相符。若是同时有数个资料表,那么 n 可以从 0 开始依序递增即可。

2005/4/9 11:00
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


xoops模组开发手册(繁体中文转简体中文)-5/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
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";
?>
引用:

2005/4/9 11:05
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


xoops模组开发手册(繁体中文转简体中文)-6/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
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 程序撰写能力,应该相当容易懂。
.

2005/4/9 11:12
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


xoops模组开发手册(繁体中文转简体中文)-7/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
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; //是否加入主选单

这样最基本的模块就大功告成了!
.

2005/4/9 11:16
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


xoops模组开发手册(繁体中文转简体中文)-8/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
8 安装模块
做到这里,最简单的模块已经出炉了!您可以将模块上传,并开始进入管理接口中的模块管理来进行安装!
Open in new window

图 2. 模块安装画面

安装后,您就会看到您的管理区多了一个模块的管理图标,而且,选单中也会有内容喔!点进去就可以进到管理主程序去新增内容啰!

Open in new window

图 1. 管理画面

新增内容后,回到首页就可以看到选单上也出现了模块名称,点进去便可以看到主要画面了!
Open in new window

图 3. 使用者看的主画面

以上是最阳春,但算是小而美的模块。不过,此模块的版面目前得靠修改程序才能作改变,如此,太埋没 XOOPS2 强大的样版功能了,所以接着我们就来看看如何将程序与版面分开来!

2005/4/9 11:22
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


xoops模组开发手册(繁体中文转简体中文)-9/11
初级会员
注册日期:
2005/3/31 15:21
所属群组:
注册会员
帖子: 27 | 精华: 2
等级: 3; EXP: 93
HP: 0 / 73
MP: 9 / 1209
离线
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 去瞧瞧喔! .

2005/4/9 11:30
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


(1) 2 3 »

  [无发表权] 请登录或者注册


可以查看帖子。
不可发帖。
不可回复。
不可编辑自己的帖子。
不可删除自己的帖子。
不可发起投票调查。
不可在投票调查中投票。
不可上传附件。
不可不经审核直接发帖。
不可使用主题类别。
不可使用HTML语法。
不可使用签名档。

[高级搜索]