易游网-易游模拟器

 找回密码
 立即注册
查看: 2370|回复: 0

[php] Discuz插件开发学习笔记 20210221

[复制链接]

1406

主题

1663

帖子

1万

积分

管理员

夏墨独周

Rank: 9Rank: 9Rank: 9

积分
10094

论坛元老技术达人

QQ
发表于 2021-2-21 10:44:24 | 显示全部楼层 |阅读模式
1、discuz运行插件程序使用数据库读取和缓存读取这两种方法获取插件信息和参数。
2、discuz的插件接口已经对插件信息进行了合理缓存,使用缓存读取的方式,将比数据库读取速度更快,消耗的资源几乎可以
忽略不计。
3、缓存读取唯一的局限是需要插件使用插件接口提供的通用后台管理程序。如果使用自定义后台模块的方式,需要后台模块
将参数存放到pluginvars数据表中,才能被系统正常缓存。强烈推荐通过缓存读取插件信息和配置数据。
4、调用系统缓存统一通过loadcache()函数。并存放在$_G['cache']中。因此 loadcache('plugin')后插件的变量缓存会存放于$_G['cache']['plugin']中。
嵌入点插件和以plugin.php为主脚本调用的插件无需加载此缓存,系统已自动加载了缓存。
变量配置类型为"版块/*"的变量会保存在$_G['cache']['forums']['fid']['plugin']中,
变量配置类型为"用户组/*"的变量会保存在$_G['cache']['usergroup_groupid']['plugin']和$_G['group'][plugin]中。
5、discuz模块开发:页面嵌入模块、特殊主题模块、第三方扩展模块

6、插件能实现哪些功能:
页面显示嵌入点
前台功能入口,比如打卡签到
菜单选项模块
后台管理功能
论坛主题数据处理功能

7、开启插件开发模式
/config/config_global.php   //discuz总的配置文件
$_config[plugindeveloper]

8、页面嵌入点:修改页面显示
信息提示嵌入点:修改showmessage()
广告嵌入点:处理广告位数据
功能嵌入点:处理主题帖子头像数据等

9、全局页面嵌入点类
class plugin_插件标识符{}
普通嵌入点类
class plugin_插件标识符_入口文件名{}
观察嵌入点所在url文件名
页面嵌入点方法命名规则
全局页面嵌入点方法
function global_任意(){}
输出前置页面嵌入点方法
function 模块名_任意_output(){}
一般是程序运行之后,模板调用之前运行的
function index_phpchina_output(){
global $_G;
$_G['member']['username'] = 'hehe';
}
一般用来修改变量

普通页面嵌入点方法
function 模块名_任意(){}

php语句末尾的分号一定不能少,否则编译不过

普通嵌入点类必须继承全局嵌入点类,这样子代码才能执行

页面嵌入点有两种类型,string和array

10、插件模板引用
模板名称是以htm结尾
include template(插件标识符:模板所在目录名称/模板文件)
插件模板必须要使用的block标签
<!--{block 变量名不带$}-->
html内容
<!--{/block}-->

function common(){
}  //公共嵌入点,会在所有其他嵌入点执行之前调用

11、showmessage("提示内容",显示完跳转路径)

信息嵌入点,是由showmessage触发的
模块名_任意_message

12、discuz内置调试方法 debug($p);打印变量
广告hook,调试的时候不显示,配置要改成0就出来了
文本解析discuzcode
对这个变量进行操作
$_G['discuzcodemessage'] .= '----PHPChia出品';
$author = DB::result_first("SELECT author FROM %t WHERE tid = %d",
array('forum_thread', $id));//注意去掉表前缀

13、send_pm,通过uc,发送站内信
avatar(), 头像hook函数

14、模板中调用语言包
{lang ppctest:username}

15、内置后台管理插件
loadcache('plugin');
debug($_G[cache]['plugin']['插件唯一标识符']['变量名']);
preg_match("/($badword)/",$_GET['username']);正则匹配

16、cpmsg();//后台提示

17、模板中输出常量比如formhash {FORMHASH}
{template common/header}//子模版标签
{template common/footer}
empty($_GET['user'])

18、数据库插入
方法名:
        DB::insert()
参数解释:
        $table:插入数据的表
        $data:插入的数据,字段对应值
        $return_insert_id:是否返回插入数据的ID
        $replace:是否使用replace into
        $silent:操作失败是否不提示

DB::insert('test_db', array(
'name' => 'ppc',
));
返回插入的id
当原始表中存在不能重复的数据,replace into就相当于更新
不存在时就相当于插入

19、数据库删除
方法名:
        DB::delete()
参数解释:
        $table:删除数据的表
        $condition:删除的条件
        $limit:删除满足条件的条目数
        $unbuffered:是否使用无缓存查询

20、数据库更新
方法名:
        DB::update()
参数解释:
        $table:更新数据的表
        $data:更新的数据,字段对应值
        $condition:更新的条件
        $unbuffered:是否使用无缓存查询
        $low_priority:是否采用无锁表更新

21、数据库查询
绑定查询的参数解释:
        %t        DB::table()
        %d  intval()
        %s  addslashes
        %n  IN(1,2,3)
        %f  sprintf('%f', $var)
        %i  不做任何处理
查询一条:
方法名:
        DB::fetch_first()
参数解释:
        $sql:查询数据的SQL语句
        $arg:绑定查询的参数
        $silent:查询失败时是否不提示

查多条:
方法名:
        DB::fetch_all()
参数解释:
        $sql:查询数据的SQL语句
        $arg:绑定查询的参数
        $keyfield:一维索引的字段名称
        $silent:查询失败时是否不提示

单字段查询(MAX COUNT AVG MIN统计查询)

单字段查询:
方法名:
        DB::result_first()
参数解释:
        $sql:查询数据的SQL语句
        $arg:绑定查询的参数
        $silent:查询失败时是否不提示

自定义查询query:
方法名:
        DB:query()
参数解释:
        $sql:自定义SQL语句
        $arg:需要绑定的数据
        $silent:执行SQL失败时,是否不提示
        $unbuffered:是否使用无缓存查询

DB::fetch($query)取到一个二维数组
DB::result($query, 1)取结果集几个
DB::num_rows($query)计算结果集行数
DB::free_result($query)资源集资源释放
DB:rder('id','DESC')
DB::limit($start, $count)
接受二维数组 $result[] = $arrayresult

22、字段拼接:
方法名:
        DB::implode()
参数解释:
        $array:需要拼接的字段数据
        $glue:字段拼接的字符串
字符串类型数据,没有经过转义,导致注入漏洞
用implode拼接字段可以避免

23、source/class/table/talbe_xxxx.php 内置模型
source/plugin/插件目录/table/table_xxx.php

模型调用方法:
内置模型调用
C::t('模型类名')->模型方法()

插件模型调用
C::t('#插件标识符#模型类名')->模型方法()

前台功能模块
插件url链接格式
plugin.php?id=插件标识符:功能文件名
error_reporting(E_ALL);

24、插件代码执行流程
功能开始->提交->数据验证->写入数据库->提示用户
                        |否
功能开始<-显示表单
验证是否是表单提交
submitcheck()

把表单hash或者表单令牌加到提交里,就不会出现来路不对问题。

<?php
error_reporting(E_ALL); //报告所有错误

if(!submitcheck('submit')){
$formhash = For
echo <<<EOF
<form action="plugin.php?id=ppctest:testapp" method="post">
用户名:<input type="text" name = "user" value=""/><br/>
<input type="hidden" name="formhash" value="$formhash">
<input type="submit" name="submit" value="提交"/>
</form>
EOF;
}else{

}

>

25、提示信息函数解析
函数名:showmessage()
参数:
        $message:提示用户信息
        $url_forward:显示信息后跳转链接
        $values:显示信息附加变量数据
        $extraparam:附加信息参数
        $custom:自定义信息模板
       
showmessage(提示信息,跳转链接)

26、数据变量获取
用户登录标识:$_G['uid']
配置信息获取:$_G['config']
用户信息获取:$_G['member']
Cookie数据获取:$_G['cookie']
缓存数据获取:$_G['cache']
Get,Post数据获取 $_GET $_POST

来源:易游模拟器(QQ:207621422),转载请注明出处!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|易游网-易游模拟器 Copyright @2015-2021 ( 浙ICP备15028007号-1 )

GMT+8, 2024-5-5 21:15 , Processed in 0.024415 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表