• XOOPS模块的开发设计教程文档 - [xoops]

    2008-03-14

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://yaho.blogbus.com/logs/16987248.html

    XOOPS模块的开发设计教程文档
    一、概述
    本文档主要介绍XOOPS模块的开发设计及安装配置。Xoops的模块的便于安装 在xoops系统下,主要作用由其自身的功能决定,现在[url]www.xoops.org.cn[/url]下有很多 免费的模块下载。开发xoops的模块就要参照它官方的标准来制作,后面我主要通 过eclipse制作一个例子来介绍xoops模块的开发。看本文前请先阅读同目录下 《CMS之XOOPS介绍.doc》

    二、开发设计
    1.文件结构
    设计前,请按以上标准来建立文件夹。区块程序文件夹也要建立一个模板 文件夹来放置blocks的模板 /templates/blocks,.project为eclipse工程文件。

    2.编写xoops_version.php文件
    xoops_version.php是一个模块的核心配置文件,是和主程序连接的纽带。

    // 模块名称
    $modversion['name'] = '文件管理';
    // 版本号
    $modversion['version'] = '1.00';
    // 模块说明
    $modversion['description'] = '一个测试的模块';
    // 版权所有者
    $modversion['credits'] = 'MyRice.Dep';
    // 作者
    $modversion['author'] = 'Alex Jia';
    // 帮助页面
    $modversion['help'] = 'help.html';
    // 版权列号
    $modversion['license'] = 'GPL see LICENSE';
    // 模块 logo 图片
    $modversion['image'] = 'images/logo.png';
    // 模块目录名称
    $modversion['dirname'] = 'test';
    // 模版文件
    $modversion['templates'][1]['file'] = 'test_index.html';
    // 模版说明
    $modversion['templates'][1]['description'] = 'Test Form';
    更详细的关于xoops_version.php程序配置请查看 [url]http://dev.xoops.org/modules/phpwiki/index.php/ModVersion[/url]

    3.语言模块文件夹文件结构设置
    以简体中文为例在language下chinese文件夹 language/Chinese,需要的程序文 件请见下图。   然后对需要设置的部分的对应的语言文件进行编写 例如:modinfo.php

    <?php
    //先建一个 modinfo.php 代码如下, define为定义常数函数,xoops 的习惯,常第
    一字母为 _ ,
    //以大写字母为常数名。
    define("_NAME","文件管理");          
    define("_DESC","一个简单的文件程序");
    ?>
    4.制作一个logo.png的模块logo图片文件放到images文件夹下。(这里的logo后缀
    一定要用.png,也就是说logo必须为png格式的文件)



    5.编辑index.php文件
    系统默认读取web发布文件

    <?php
    // 插入系统设定文挡
    include "../../mainfile.php";
    // 插入头文件
    include "../../header.php";
    echo "文件管理模块";
    // 插入尾文件
    include "../../footer.php";
    ?>
    OK,现在这个测试的安装小模块已经完成。我们安装测试一下 我们把我们刚刚写的模块放到xoops/modules下,然后进入xoops的模块管理区, 要安装的模块都会在最下端显示,如下图:



    然后点模块状态下面那个黑色的图标进行安装,进入下一步,如下图





    点安装按钮进行安装



    这里看到的test_index.html我们在后面进行编写 点回到模块管理菜单见下图,安装成功。



    6.接下来我们写test.index.html文件 此文件放到templates文件夹下。
    应用到php的部分应该用smarty格式编写<{$var}>

    <form action="<{$smarty.server.PHP_SELF}>" method="post"
    enctype="multipart/form-data">
    <table width='100%' class='outer' cellspacing='1'>
    <tr><th colspan='2'>文件管理</th></tr>
    <tr>
    <td class='head'>标题</td>
    <td class='even'><input type="text" name="d_name" size="30"></td>
    </tr>
    <tr>
    <td class='head'>类别</td>
    <td class='even'>
    <select name="d_kind">
    <{html_options values=$kind_arr output=$kind_arr }>
    </select>
    </td>
    </tr>
    <tr>
    <td class='head'>说明</td>
    <td class='even'><input type="text" name="d_memo" size="60"></td>
    </tr>
    <tr>
    <td class='head'>文件</td>
    <td class='even'><input type="file" name="infile"></td>
    </tr>
    <tr>
    <td class='head'></td>
    <td class='head'><input type="submit" name="op" value="上传"></td>
    </table>
    </form>

    7.更新模块让系统读入新写的模板页


    更新后提示成功



    这有个小技巧,在开发模块的时候,也许我们得经常的更新模板页,每次更新一次就得按 上面的程序操作一次,有写麻烦,xoops之所以这样设计是为了加快读取摸板的速度,在摸板 开发阶段,可以把自动更新模块设置为“是”,这样就可以减少麻烦了。



    8.修改index.php,插入test_index.html
    <?php
    // 插入系统设定文挡
    include "../../mainfile.php";
    // 插入头文件
    include "../../header.php";
    // 插入模板
    $xoopsOption['template_main'] = "test_index.html";
    // 插入尾文件
    include "../../footer.php";
    ?>
    9.接下来我们要求模块对数据库进行一下操作建立一个表
    写一个mysql.sql的文件如下 ,放到test/sql文件夹下

    d_id 流水号
    -- uname   用户名
    -- d_name 标题
    -- d_kind 类别
    -- d_memo 说明
    -- d_time 插入时间
    -- d_file 文件名
    CREATE TABLE `test` (
       `d_id` int(11) NOT NULL AUTO_INCREMENT,
       `uname` varchar(25) NOT NULL DEFAULT '',
       `d_name` varchar(40) NOT NULL DEFAULT '',
       `d_kind` varchar(20) NOT NULL DEFAULT '',
       `d_memo` varchar(100) NOT NULL DEFAULT '',
       `d_time` timestamp(14),
       `d_file` varchar(100) NOT NULL DEFAULT '',
       PRIMARY KEY   (`d_id`)
    ) ENGINE=MyISAM;.
    10.修改 xoops_version.php,加入数据库设置相关代码,如下:
    // 数据表结构
    $modversion['sqlfile']['mysql'] = "sql/mysql.sql";
    // 数据表名称
    $modversion['tables'][0] = "test";
    $modversion[’tables’][n] , n从0开始编写,但名称必须和 sql/mysql.sql中的语句想符合,用到那个表都要在这里声明,我们这里 只是使用CREATE TABLE `test` 所以 $modversion[’tables’][0]= “test”;

    11. 如果第一次安装时没有建立数据库表结构,必须反安装模块组,
    再重新安装,让系统重新载入数据库。(这里步骤不在重复)

    12.在test/主目录建立upload.php文件
    <?php
    // 插入系统设定文挡
    include "../../mainfile.php";
    // 插入头文件
    include "../../header.php";
    //判断使用者身份
    if (! $xoopsUser ) {
        redirect_header(XOOPS_URL,3,'没有权限使用被模块');
        exit;
    }
    // 判使用者是否按送按
    if ($_POST['op'] == '上传'){
    // 取得使用者
    $uname = $xoopsUser->getVar("uname");
    $d_name = $_POST['d_name'];
    $d_memo = $_POST['d_memo'];
    if (is_uploaded_file($_FILES['infile']['tmp_name'])){
           // 不允许上传php程序文件
           $no_arr = array("php","php3","exe","dll");
           $temp_arr = explode(".",$_FILES['infile']['name']);   
           if (in_array(strtolower(end($temp_arr)),$no_arr)){
                redirect_header('index.php',2,"不允许上传 php 文件");
                exit;
           }
           $file_path = XOOPS_UPLOAD_PATH."/test";
           // 如果未建立目录则在uploads下建立test的目录
       if (!is_dir($file_path)){
          // 建立目录
          mkdir($file_path);
       }
       // 存档名称
       $d_file = time()."_".$_FILES['infile']['name'];   
       // copy 上传文件到 uploads 下,上传文件名称加上时间避免同名覆盖
       copy($_FILES['infile']['tmp_name'],$file_path."/".$d_file);
    }
    // 插入到数据库
    $sql = "INSERT INTO ".$xoopsDB->prefix("test")."
    (uname,d_name,d_memo,d_file)VALUES('$uname','$d_name','$d_memo','$d_file')";
    if ( !$result = $xoopsDB->query($sql) ) {
       // 删除文档
       unlink($file_path."/".$d_file);
       redirect_header('index.php',2,"添加失败!");   
       exit();   
       }
       redirect_header('index.php',2,"新增成功!");
    }
    // 插入模板
    $xoopsOption['template_main'] = 'test_index.html';
    // 插入尾文件
    include "../../footer.php";
    ?>
    13.在 xoops_version.php 加入第二个模板并增加子菜单,如下例,
    再由系统管理处更新模块,重新载入模板文件到系统。

    // 模板文件
    $modversion['templates'][2]['file'] = 'test_view.html';
    $modversion['templates'][2]['description'] = '列出文件';
    $modversion['templates'][3]['file'] = 'test_sel.html';
    $modversion['templates'][3]['description'] = '查看文件';
    // 加入子
    $modversion['sub'][1]['name'] = '文件列表';
    $modversion['sub'][1]['url'] = "view.php";
    $modversion['sub'][2]['name'] = '类别管理';
    $modversion['sub'][2]['url'] = "kind.php";
    14.编辑view.php 放到test/ 主目录
    <?php
    include "../../mainfile.php";
    include "../../header.php";
    if ($_REQUEST['op']=='delete'){
    $d_id = $_REQUEST['d_id'];
    $uname = $xoopsUser->getVar('uname');
    $sql = "SELECT d_file FROM ".$xoopsDB->prefix('test')."
    WHERE d_id='$d_id' AND uname='$uname'";
    $res = $xoopsDB->query($sql);
    if ($xoopsDB->getRowsNum($res) >0 ){
             $rows = $xoopsDB->fetchArray($res);
             $d_file = $rows['d_file'];
             $sql = "DELETE FROM ".$xoopsDB->prefix('test')."
    WHERE d_id=$d_id";
             $xoopsDB->query($sql);
             // 删除文件
             $d_file = XOOPS_UPLOAD_PATH."/test/$d_file";
             unlink($d_file);
    }
    }
    // 载如模板
    $xoopsOption['template_main'] = 'test_view.html';
    // 查询 test 文件
    $query = "SELECT * FROM ".$xoopsDB->prefix("test");
    $res = $xoopsDB->query($query);
    // 将查询结果放回数组
    $arr = array();
    while($rows = $xoopsDB->fetchArray($res)){
    $arr[] = $rows;
    }
    // 将结果数组传给模板
    $xoopsTpl->assign("docdata",$arr);
    // 将用户帐号传回模板
    $xoopsTpl->assign("uname",$xoopsUser->getVar('uname'));
    include "../../footer.php";
    ?>
    15.编辑test_view.html 放到templates/文件夹
    <table class='outer' cellpadding='4' cellspacing='1'>
    <tr valign='middle'><th>标题</th><th>上传人</th><th>文件</th>
    <{if $uname}><th>管理</th><{/if}>
    </tr>
    <!-- 显示所有上传的文件 -->
    <{foreach from=$docdata item=data}>
    <tr class="<{cycle values="even,odd"}>"><td><a href='sel.php?d_id=
    <{$data.d_id}>'><{$data.d_name}></a></td><td><{$data.uname}></td>
    <td><a href='<{$smarty.const.XOOPS_URL}>/uploads/test/<{$data.d_file}>'
    target='_blank'><{$data.d_file}></a></td>
    <{if $uname}><td><{if $uname eq $data.uname}><a href=
    '<{$smarty.server.PHP_SELF}>?op=delete&d_id=<{$data.d_id}>'>删除</a><{/if}>
    </td>
    <{/if}>
    </tr>
    <{/foreach}>
    </table>
    16.编辑sel.php 放到test/主文件夹
    <?php
    include "../../mainfile.php";
    include "../../header.php";
    $xoopsOption['template_main'] = 'test_sel.html';
    // 查询 test 资料
    $query = "SELECT * FROM ".$xoopsDB->prefix("test")."
    WHERE d_id=".$_REQUEST['d_id'];
    $res = $xoopsDB->query($query);
    $rows = $xoopsDB->fetchArray($res);
    // 将结果传给模板
    $xoopsTpl->assign("data",$rows);
    include "../../footer.php";
    ?>
    17.编辑test_sel.html 放到templates/文件夹
    <table width='100%' class='outer' cellspacing='1'>
    <tr><th colspan='2'>文件管理</th></tr>
    <tr>
    <td class='head'>序号</td>
    <td class='even'><{$data.d_id}></td>
    </tr>
    <tr>
    <td class='head'>上传时间</td>
    <td class='even'><{$data.d_time}></td>
    </tr>
    <tr>
    <td class='head'>标题</td>
    <td class='even'><{$data.d_name}></td>
    </tr>
    <tr>
    <td class='head'>说明</td>
    <td class='even'><{$data.d_memo}></td>
    </tr>
    <tr>
    <td class='head'>文件</td>
    <td class='even'><{$data.d_file}></td>
    </tr>
    </table>
    18. 在 xoops_version.php 加入区块设置,如下:
    (其实xoops里的区块就是指首页的样式,只要进入区块设置看一下就知道了)

    // 区块模板
    $modversion['templates'][4]['file'] = 'test_new.html';
    $modversion['templates'][4]['description'] = 'lastest file ';
    // 区块设置
    $modversion['blocks'][1]['file'] = "news_block.php";
    $modversion['blocks'][1]['name'] = "新加入文件";
    $modversion['blocks'][1]['description'] = "显示新加入文件";
    $modversion['blocks'][1]['show_func'] = "b_news_show";
    $modversion['blocks'][1]['template'] = 'news_block.html';
    19. 在 test/blocks 目录添加 news_block.php
    <?php
    // 显示最新的5个新增文件
    function b_news_show() {
           global $xoopsDB;       
           $sql = "SELECT d_id,d_name,d_time FROM ".$xoopsDB->
    prefix('test')." ORDER BY d_time LIMIT 5 ";
           $res = $xoopsDB->queryF($sql);
           $block = array();
             while($rows = $xoopsDB->fetchArray($res)){
                $block[] = $rows;
             }         
           return $block;
    }
    ?>
    20. 在 templates/blocks 目录建立 news_block.html
    <ul>
       <{foreach item=docs from=$block}>
    <li><a href="<{$xoops_url}>/modules/docman/sel.php?
    d_id=<{$docs.d_id}>"><{$docs.d_name}></a>
    (<{$docs.d_time|date_format:"%Y-%m-%d"}> )</li>
       <{/foreach}>
    </ul>
    21.添加区块
    现在我们把刚刚完成的区块添加到首页



    完成如下图



    22.制作管理文件页面
    下面需要做一个管理页面把以上写过的三个文件关联起来 , 也就是在管理的下拉菜单中显示出来。需要在admin文件夹下建立两个文件 test/admin/admin.php 管理页面首页 test/admin/menu.php 下拉菜单显示 而且还修改xoops_version.php配置文件

    建立admin.php文件 代码如下:

    <?
    include '../../../include/cp_header.php';
    xoops_cp_header();
    $xTheme->loadModuleAdminMenu(1, _PROFILE_MI_INDEX);
    xoops_cp_footer();?>
    建立menu.php文件代码如下

    <?php
    $adminmenu[1]['title'] ="上传文件";
    $adminmenu[1]['link'] = "upload.php";
    $adminmenu[2]['title'] = "文件管理";
    $adminmenu[2]['link'] = "view.php";
    ?>
    修改xoops_version.php配置文件在最后添加

    // 管理接口
    $modversion['hasAdmin'] = 1; //是否有管理接口
    $modversion['adminindex'] = "admin/admin.php"; //管理接口的首页位置
    $modversion['adminmenu'] = "admin/menu.php"; //管理接口的选单程式
    // Menu
    $modversion['hasMain'] = 1; //是否有菜单项
    ok现在程序就已经基本完成我们更新一下,看一下结果

    历史上的今天:


    收藏到:Del.icio.us




    评论

  • 你 好,我再网上下载了你的《她爱小孩》
    网站ASP源码,但是没有密码和验证码,无法管理,
    请求你的帮助,非常感谢!!
    我的QQ:4218514
    这个邮箱是我的,你回复给我也可以。。。
    非常感谢!!