正义潘恩 发表于 2023-12-7 00:25:29

玩转Discuz!——七天学会插件制作

前言
我想这里有很多人向往自己DIY插件,可是从FD到DZ我看没几个人详细写过插件的制作方法!呵呵,现在我自不量力写点。我也是菜鸟出生并不是计算机专业,对于程序语言知之甚少,但是非常感谢DZ能够使我增加知识!所以希望大家热爱DZ,这里是我们进步的伊甸园!
你可能会害怕担心繁琐的PHP SQL HTML语句把你搞得晕晕糊糊,相信我七天后你不在有恐惧,而是激发起更多的好奇心,打造自己的插件群!你只要拥有猴子的智商就可以制作Discuz!插件,关键所在——”模仿“!
我这里会做一个插件示例,逐步的带你进入轻松的插件制作七天之旅!或许我用的语言是最通俗的,在专业人员眼里如同儿戏,但是相信这是最实用、易懂的,如果有什么不足或者错误欢迎指正!
插件制作的基本思路是:(初学者适用)
1.形成插件思路
2.制作插件界面
3.构架程序模块
4.搭建存储数据
5.填充功能语句
6.检查应用错误
7.完善插件功能
我这么写也就是我认为Discuz!的开发是面向过程的,你只要知道事情的流程一步步做下去就可以,用不着描述对象、属性、方法等面向对象开发插件!后者更高级但是等你会了在慢慢晋级!


第一天 怎么新增插件?

1.系统设置——插件管理——新增——插件名称——唯一标识——提交
插件名称:插件的中文名字,也可以是其他语言,不过我是中国人只写中文,名字最好通俗易懂便于理解,例如:购物中心。
唯一标识:插件的英文代码,没办法计算机程序是外国人写的,必须遵守他们的规矩,唯一标识最好是翻译插件名称。例如:购物中心——shopping


2.编辑插件 - 购物中心
后台权限等级:这是设定谁可以管理插件设置里的插件!一般当然是管理员,除非你有后台模块需要版主帮你管理!
插件目录:就是放插件程序地方,./plugins/这个文件夹在根目录下,如果插件多了文件一大堆分不清文件是那个插件的就不好了!所以要在这个目录下做个插件的文件夹。这里我们就建立一个shopping文件夹,别忘了shopping/后面有个斜杠的符号
插件数据表:这部分你可能开始用不到,但是等你做到构造存储数据你就会用到!以后再说
插件描述:地球人都知道,插件作用的简单描述!


填完这些那么你就创建了一个插件,但是这是不过是表面文章,接下来我们继续创建插件!

3.添加模板和PHP文件
我使用实时编辑的方法写插件,这样的好处在于所见即所得,不知道你喜不喜欢!上传工具:CUTEFTP3.3我使用这个是因为HTML有提示功能非常简捷!怎么用大家去网上搜索一下功略!


A.在根目录——plugins文件夹下——创建shopping文件夹(这就对应了前面插件目录的填写)


B.在shopping文件夹里创建shopping.inc.php文件


为什么文件的命名有inc呢?文件命名规范

Discuz! 按照如下的规范对程序和模板进行命名,请在设计插件时尽量遵循此命名规范:

1.可以直接通过浏览器访问的普通程序文件,以 .php 后缀命名。
2.被普通程序文件引用的程序文件,以 .inc.php 后缀命名。
3.被普通程序文件,或引用程序文件引用的函数库或类库,以 .func.php(函数库) 或 .class.php(类库) 后缀命名。
4.模板文件,以 .htm 后缀命名,模板文件只存在于 ./templates 目录中。
5.模板语言包文件,以 .lang.php 后缀命名,语言包文件只存放于 ./templates 目录中,与模板文件同级目录。
6.被编译后的模板文件,以 .tpl.php 后缀命名,前面的数字是模板套系的 ID,下划线后面的是模板原名,编译模板文件只存在于 ./forumdata/templates 目录中。
7.动态缓存文件,存放于 ./forumdata/cache 目录中,依据不同的功用进行独立的命名。
8.使用后台数据备份功能生成的备份文件,通常以 .sql 为后缀,存放于 ./forumdata/ 目录中。
9.有些目录中存在内容为空白的 index.htm 文件,此类文件是为了避免 Web 服务器打开 Directory Index 时可能产生的安全问题。


C.在./templates/default/——创建shopping.htm


好了这样我们就做好了创建插件的准备工作!

4.创建菜单链接——插件模块和自定义菜单


程序模块:这个是指./plugins/shopping.inc.php这个文件,我们已经做好了,所以填写shopping
菜单名称:这是指前台的菜单显示,很多人问插件菜单名怎么变红色=>
[*]<font color=red>购物中心</font>

复制代码

填这个就行,这里你学到了第一句HTML语法:<字体设置颜色参数=颜色代码>文字<围堵标记>,其中的颜色代码可以是16进制代码也可以固定英文代码例如:red也就是#FF0000   你用百度搜索颜色代码表到处都是啦!
模块类型:插件模块和自定义菜单:
插件接口默认提供四种可选的模块方式:

1.直接链接(前台菜单):可在前台右上角加入一个菜单项,可自主指派菜单链接的 URL。注意:由于引用外部程序,因此即便设置了模块的使用等级,您的程序如需权限判断,仍需要引用 common.inc.php 和插件相关的缓存文件(将在后面的《参数读取与缓存控制》中详细说明),并自行判断使用等级是否合法;

2.前台调用(前台菜单):与直接链接类似,但其调用的是插件的一个模块,模块文件名指派为“./plugins/插件目录/插件模块名.inc.php”,由 plugin.php 调用此模块,调用 URL 将在后面的《编写插件的原则与注意事项》中详细说明;

3.后台调用(后台菜单):可在后台插件设置中为此插件增添一个管理模块,模块文件名指派为“./plugins/插件目录/插件模块名.inc.php”,由 admincp.php 调用此模块,调用 URL 将在后面的《编写插件的原则与注意事项》中详细说明;

4.包含运行(无菜单):可设置一个在论坛所有页面均包含运行的脚本,此脚本在 ./include/common.inc.php 中加载,脚本文件名指派为“./plugins/插件目录/插件模块名.inc.php”。请注意,为了不导致错误的插件影响论坛运行,在 common.inc.php 加载此模块时,屏蔽了错误信息,因此请务必仔细检查是否存在语法错误,任何微小的语法错误都将不被提示出来,并且导致此模块不被正常加载。如果您配置了不正确的包含脚本而导致论坛系统设置无法使用,删除服务器上相应的脚本文件即可解决。

您可以为每个模块设置不同的使用等级,例如设置为“超级版主”,则超级版主及更高的管理者(例如论坛管理员)可以使用此模块。


看到了应该很简单前台文件、后台文件、调用外部文件、初始化文件!就这四种!那么一般的插件文件当然是前台调用

这里要说明一个调用问题,文中多次说到./include/common.inc.php是否加载,也就是说加载了这个文件,你就可以轻松的得到会员名、会员uid、会员的积分信息、论坛的分类、各级会员组用户组信息,简单说就是汽车加了汽油你可以开了,前后台调用都加载了这个文件;包含运行是把程序写入这个文件;前台链接没有加是需要你另外添加的!

使用等级:不用说了给谁用的!

好了给你看看菜单是在哪里显示:



5.编写插件的原则与注意事项
所有与插件有关的程序,包括全部的前后台程序,因全部使用外壳调用,请务必在第一行加入
[*]      if(!defined('IN_DISCUZ')) {
[*]                exit('Access Denied');
[*]      }

复制代码

你不需要懂这句语法什么意思,你只要照搬制作就可以,我们在shopping.inc.php的文件里加上这样的语句
[*]<?php
[*]      if(!defined('IN_DISCUZ')) {
[*]                exit('Access Denied');
[*]      }
[*]?>

复制代码


这里你看到了PHP的代码块的标记,不管是在PHP、HTM扩展名的文件里只要用了<?……php代码……?>那么你就可以写代码了!我们不用搞得很清楚具体四种到底什么意思,反正就是把代码放进去做插件呗!哈哈哈哈,菜鸟也学的会!

从 HTML 中分离的四种方式1.<?php echo("if you want to serve XHTML or XML documents, do like this\n"); ?>

2.<? echo ("this is the simplest, an SGML processing instruction\n"); ?>
    <?= expression ?> This is a shortcut for "<? echo expression ?>"

3.<script language="php">
      echo ("some editors (like FrontPage) don't
            like processing instructions");
    </script>

4.<% echo ("You may optionally use ASP-style tags"); %>
    <%= $variable; # This is a shortcut for "<% echo . . ." %>


好了今天就学到这里,我们已经有了自己的插件壳,还没有内容,嘿嘿!第一天已经加入高手行列!




第二天 怎样制作插件模板?

1.怎样套用DZ的默认模板
DZ是个良好的PHP教材   不论是严谨性还是技巧性甚至我觉得还是很通俗的!你所要得模板格式这里都能找到!

首先我们要了解DZ的模板都在哪里:
./templates/ 这个文件夹是DZ的模板包
./templates/default/这里存放的是默认风格的模板

昨天我们已经创建了sopping.htm的购物中心模板,现在需要的就是增加HTML的代码!让我们的插件界面可以直观的显示出来!使用过DZ的都知道,论坛由顶部区域和底部区域加上中间的列表、帖子构成,所以我们第一步需要把顶底两个界面显示出来!

这里我们先学制作模板第一个猴子动作——调用模板!
[*]{template header}——调用头模板
[*]
[*]…………——中间是插件模板
[*]
[*]{template footer}——调用脚模板

复制代码


调用模式 {template 模板名} DZ使用花括号+template模板名 调用./templates/下的各种风格模板,这种模板包含模板的方式十分的便捷!

然后就是第二个猴子动作——加载信息代码

[*]<table cellspacing="0" cellpadding="0" border="0" width="{TABLEWIDTH}" align="center" style="table-layout: fixed">
[*]<tr><td class="nav" width="90%" align="left" nowrap>&nbsp;<a href="index.php">$bbname</a>&raquo; {lang member_login}</td>
[*]<td align="right" width="10%">&nbsp;<a href="#bottom"><img src="{IMGDIR}/arrow_dw.gif" border="0" align="absmiddle"></a></td>      
[*]</tr></table><br>

复制代码


这段代码几乎是固定的,显示如下:


现在你就明白这段代码的意思,这是一个论坛分类信息的区域,一级论坛——二级分类——三级分类……。
我们开始学习HTML的几个标记:

A.表<table>……</table>
B.行<tr>……</tr>
C.列<td>……</td>
注意这些都是围堵标记,内容包括其中。
目前DZ为了加快页面显示多了一个
D.<div>……</div>

我们只要套用这些标记就能做出自己的页面 例如:
[*]<div>
[*]<table>
[*]<tr>
[*]<td>你好</td>
[*]<td>谢谢</td>
[*]</tr>
[*]</table>
[*]</div>

复制代码


这样就构成一个一行两列的表格,呵呵,很简单吧,你用office的fontpage很快就可以做出来!我只是给你们简单介绍一下。那我们再拆开上面的代码说一下:

[*]<table cellspacing="0" cellpadding="0" border="0" width="{TABLEWIDTH}" align="center" style="table-layout: fixed">【表标记】
[*]<tr>【行标记】<td class="nav" width="90%" align="left" nowrap> 【列标记】<a href="index.php">$bbname【论坛名称】</a>【链接】&raquo; $navtitle 【分类名称】</td>
[*]<td align="right" width="10%"> <a href="#bottom"><img src="{IMGDIR}/arrow_dw.gif" border="0" align="absmiddle">【图片】</a></td>      
[*]</tr></table><br>

复制代码


大致了解了就好,我们的任务就是套用,贴上去就行,看看现在模板是什么样?
shopping.htm模板
[*]{template header}
[*]<table cellspacing="0" cellpadding="0" border="0" width="{TABLEWIDTH}" align="center" style="table-layout: fixed">
[*]<tr><td class="nav" width="90%" align="left" nowrap>&nbsp;<a href="index.php">$bbname</a> &raquo; $navtitle</td>
[*]<td align="right" width="10%">&nbsp;<a href="#bottom"><img src="{IMGDIR}/arrow_dw.gif" border="0" align="absmiddle"></a></td>      
[*]</tr></table><br>
[*]
[*]中间等待自己加代码!
[*]
[*]{template footer}

复制代码



我们需要记住的几个常用模板CSS
A.表格的css样式定义
[*]<table cellspacing="{INNERBORDERWIDTH}" cellpadding="{TABLESPACE}" width="{TABLEWIDTH}" align="center" class="tableborder">
[*]</table>

复制代码

{INNERBORDERWIDTH}、{TABLESPACE}、{TABLEWIDTH}都是后台风格设置的参数
class="tableborder"是CSS.htm固定的层叠样式表单 他的定义是双线表
class="category"同上 定义是灰色背景 可能还有字体不同
class="altbg1" 同上浅灰背景altbg1后台风格有设置
class="altbg2"同上白色背景   altbg2后台风格有设置
class="header"同上DZ默认兰背景粗体大字
class="outertxt"同上 黑粗小字
class="smalltxt"同上 黑细小字

2.怎么了解DZ的语言调用?
你经常会在DZ的模板里看见类似{lang faq}代码!这就是调用语言包,其实很简单本来可以写汉字,因为可能多次重复,也可能是因为便于管理,所以把各种文字归集在一起!

调用模式: {lang 语言名},和前一次一样还是熟悉的花括号+lang 语言名

那么在那里可以找到这个调用呢?

./templates/defaulttemplates.lang.php这时我们看见了模板包的这个文件,根据DZ的文件命名规范 *.lang.php 就是语言文件,我们搜索前面的语言名 faq答案是         'faq' => '帮助',


3.什么是全局变量、变量参数、判断语句?
在模板文件中,最多出现的是变量参数,类似$member['allowuseblog'],$thread['tic'],$post['id']这些都是调用数据库数据使用,我们看到的会员编号、帖子内容、标题高亮,都是由这些变量显示出来!这里不要求大家牢记,只要你认识这些变量的样子和特征。
一般会员信息出来的变量$member打头,方括号内是他的分类,就好比会员性别、会员年龄、会员注册日期,同样$post就是帖子的代名词,$thread就是主题的代名词

全局变量和变量的区别是变量只在某个程序或者某个模板才能显示或者起作用,而全局变量是在整个论坛发挥作用例如:$discuz_uid会员编号$discuz_username会员名称$extracredit这是所有积分的数组,包含八种积分的名称、单位和积分数量

判断语句:DZ为了更好的控制模板界面的显示采用了<!--{if条件}-->模板内容<!--{/if}-->对于这种判断语句大家只要熟悉,以后我们会讲他的作用和使用方法!还有<!--{loop 数组 解析变量}-->模板内容<!--{/loop}-->这种语句是把数组(简单的理解就是打包在一起的数字信息)分解开来,在模板的行和列中显示出来!

4.HTML的基本语法使用
在前言中我说过你不必去学某种语法,但并不表示一点不懂,我比较讲究实用主义,什么是我做插件需要的,那么我就去看他的方法,在今天的课程里为了要做模板我们必须去理解表单和表单域这个最基本HTML

表单:大家都看见了我们提交信息有提交框、提交按钮,这些都是让我们可以输入信息告知程序处理的入口!所谓表单就是这些不同的入口!可以让我们和程序交互信息的东东。

表单域:<FORM>称为表单标记,用以宣告此为表单模式,属于一个容器标记,表示其它表单标记需要在它的包围中才有效,简单的说表单域就是一把枪的外壳,表单就是子弹、扳机、瞄准器、撞针、枪托。只有把这些装在枪壳上那么你才可以使用这把枪打人!嘿嘿蛮暴力的!只有定义了表单域,那么才能把输入表单的信息传送给php程序,让他处理后再返回给模板显示出来!

好吧!我说的没用 给你们几个链接看看表单是那些?
HTML语言剖析——表单标记

HTML 语法教学之表单标签

今天就到这里,或许你还不理解也有可能你囫囵吞枣,没关系好好思考一下,就要看你是不是做插件的料,作为一个站长不能理解这些趁早关门、要么收费服务了,呵呵话一定要说得重才能激起你的斗志!!



第三天 怎么构造程序结构?

今天是第三天,我们真正的开始介入PHP的研究!

这里我们从DZ的登录程序入手./logging.php,对应的是./templates/default/login.htm


从login.htm模板我们可以看见:
1.隐身登录:(下拉菜单)
2.界面风格:(下拉菜单)
3.Cookie 有效期:(单选按钮)
4.用户名:(输入框)
5.密码:(密码输入框)
6.安全提问:(下拉菜单)
7.回答:(输入框)
这些组件把用户的信息传输给程序logging.php,然程序判断后做出反应:接收登录还是拒绝

昨天研究过表单域和表单的都应该明白,模板通过
[*]<form method="post" name="login" action="logging.php?action=login">
[*]……
[*]表单域中的表单组件
[*]……
[*]</form>

复制代码

action命令把表单的值(每个表单都有name,它就是储存数据的变量)传输给PHP程序
action="logging.php?action=login"中的"?"是携带参数符号、还有"&"也是携带参数符号,这个表单域携带的参数命令是action=login,那么到了PHP你就有一个$action变量

我们的目的不是再去了解模板,而是之后的动作,初步对CGI传送数据有个了解后我们进入主题!
你在logging.php很容易找到这样的格式:
[*]if($action == 'logout') {
[*]   ………………程序语句
[*]} elseif($action == 'login') {
[*]   ……程序语句
[*]}

复制代码


这是什么呢?我们知道按了提交按钮那么表单域向PHP程序传送了$action变量它的值是"login",当我们点“退出”$action变量它的值是"logout",程序的一开始就是判断你有没有点退出,这段程序的解释是:

如果用户做的是退出动作,那么这样处理,如果用户填写了登录资料,那么这样处理

if流程给我们一个固定的判断框架if(判断依据){   //如果判断依据成立   返回值 TRUE也就是真
   执行下列动作
}elseif(判断依据2){   //如果判断依据2成立   返回值 TRUE也就是真
   执行下列动作
}else{   //如果上面的几个判断依据都不成立    返回值 FALSE   也就是假
   执行下列动作
}


通过这样一个框架,我们把每个流程用是或否的逻辑把他定义出来,然后每个不同的结果做相应不同的代码操作!
希望你看到这里不会糊涂!

我们在分解一下:
[*]if($action == 'logout') {   //用户点了退出
[*]
[*]      clearcookies();    //使用清除缓存函数清除用户的缓存信息
[*]      $groupid = 7;    //设定用户组为 7 (7应该是游客用户组)
[*]      $discuz_uid = 0;    //会员编号为0(0也是游客的会员编号)
[*]      $discuz_user = $discuz_pw = '';   //用户名和用户密码为空
[*]      $styleid = $_DCACHE['settings']['styleid'];   //风格为默认风格
[*]
[*]      showmessage('logout_succeed', dreferer());    //用DZ的自定义函数showmessage向用户发出退出论坛提示信息

复制代码


ok!你很容易了解了当用户点击“退出”后程序执行了那些代码操作。这里我想说说showmessage函数,这是DZ自定义的一个函数,让程序处理完动作后告诉用户我都做了些什么?
'logout_succeed'的意思是什么?你要对应的去找./templates/default/messages.lang.php


呵呵 很容易吧只要这样定义一下 马上就可以做提示了,后面的 dreferer()当然是跳转到那个页面,我们也可以不用函数直接跳转某个链接!

另外几个要注意的PHP每个语句的结束都是用";"分号作为结尾,之所以很多插件添加后出来空白页面,有部分都是没有加结束符!

在条件语句中使用的不是"="而是"==",这称为比较运算符以后我们还会介绍!

[*]} elseif($action == 'login') {//如果填写会员资料并提交
[*]      ……………………执行程序语句
[*]      if(!submitcheck('loginsubmit', 1, $seccodecheck)) {   //如果FORMHASH未验证通过,不是按提交按钮提交数据
[*]       ……………………执行程序语句
[*]            } else {   ///如果FORMHASH验证通过,是按提交按钮提交数据
[*]       ……………………检查密码是不是与对应的会员名一致,安全提问是不是回答正确!
[*]       ……………………showmessage('login_succeed', dreferer());//提示登录成功
[*]                }
[*]}

复制代码


我们通过这段代码可以完整的了解PHP的程序结构,如何通过程序判断做一个登录后不同结果的代码处理!

除此之外,还有很多程序流程,一般你只要掌握if流程就可以写基本的程序,随着你能力增长,你会用更多的流程完善你的程序的简捷性


好了今天的介绍应该你能看懂有空的时候多看看
PHP中文手册(CHM)



第四天 怎么理解变量和运算符?

大家可能等急了!其实几天时间浏览一边 《PHP中文手册》是不够的!我所希望的只是多给几天让大家有个印象,不知道你们有没有认真的去看!好的,继续我们的PHP之旅——变量和运算符!

相信看过《PHP中文手册》变量这一章的都会一头雾水,你很难抽象的了解什么是传地址赋值?什么是预定义变量?等等!这些的确很难,只有当你看到别人的代码再会去拆解其中的含义!我们还是用最土的老办法,尽可能模仿DZ的变量复制方法和命名规则!希望大家学会这种方法,遇到问题寻找解决的办法,从形象的、实际的入手!

1.什么是变量?
变量就相当于一个碗,定义一个变量=有一个碗,变量的数值=碗里的饭菜,青菜还是萝卜=变量类型。以此类推~
变量的实质是在内存中申请或开辟一段有名空间,用于保存程序的数据东西。由于他是可以不断赋值所以叫做变化之量。

好了现在我们要向碗里放菜了!前面说过放不同的菜变量的类型也会不同:

四种标量类型:

A.布尔型(boolean):我以前学的时候很简单的认识,这个叫做逻辑性,储存的变量值就是yes、no或者真TRUE、假FALSE

B.整型(integer):整型简单点理解就是整数,哈哈哈别骂我,这么说比较通俗

C.浮点型(float)(浮点数,也作“double”) :浮点那就是小数,有小数点的都是

D.字符串(string) :这个大家都知道文字型呗!

两种复合类型:

E.数组:数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,这个编号叫做下标,我们可以通过下标来区别这些元素。数组元素的个数有时也称之为数组的长度。
一般情况下,数组的元素类型必须相同,可以是前面讲过的各种基本数据类型。但当数组类型被指定为变体型时,它的各个元素就可以是不同的类型。
数组和变量一样,也是有作用域的,按作用域的不同可以把数组分为:过程级数组(或称为局部数组)、模块级数组以及全局数组。

还是我说的简单,就是一个陈老爸八个儿子七个女儿关键都姓陈,但是每个子女都有下标编号 大儿子二女儿三闺女四小子排行就是下标(这个我们会以后详细介绍)

F.对象:呵呵你的狗、你的书桌、电视机和自行车都是对象,比如狗就有很多属性黄毛博美种黑鼻子 等等。这个只要初步了解,不是本文重点!

还有很多类型展示不去理解,因为现在用不到!现在我来举例,看看我们怎么使用变量!

你经常可以在DZ的PHP文件中看见这样的语句:./index.phprequire_once './include/common.inc.php';
require_once DISCUZ_ROOT.'./include/forum.func.php';

$discuz_action = 1;

$validdays = $discuz_uid && !empty($groupexpiry) && $groupexpiry >= $timestamp ?
      ceil(($groupexpiry - $timestamp) / 86400) : 0;


这是DZ的动作提示,变量$discuz_action等于1,在那里能看到它的含义?


首先大家记住每个变量的开头都有“$”标记,这样你就可以从程序种了解什么是变量!
我们从./templates/default/actions.lang.php看到了index.php中的$discuz_action值,这是个字符串变量。初始值1就是,动作数组的下标。通过传递赋值,它就变成我们所要知道的表示的动作文字!


用户最终了解的是其他会员的社区动作。变量是不是很神奇,你会熟练使用他的!

待续…………………………!





页: [1]
查看完整版本: 玩转Discuz!——七天学会插件制作