请选择 进入手机版 | 继续访问电脑版
查看: 85|回复: 0

Discuz自定义DIY调用模块二次开发详解

[复制链接]

494

主题

496

帖子

2576

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2576
发表于 2021-6-4 12:40:35 | 显示全部楼层 |阅读模式
Discuz程序中有一个很好用的功能,那就是DIY数据调用,有时候我们会发现在使用DIY调用的时候,都是一些系统内置的DIY调用功能,如果想实现其他的数据调用,就需要自己动手进行二次开发。这里帖子就介绍Discuz自定义DIY你不能调取数据模块的开发详解。

比如当在做discuz二次开发时,想添加了一个功能,在任何一个页面去都可以调用数据,这里通过discuz的前台diy模式去调用这些数据。在开发Discuz DIY功能时就需要我们自己写代码来实现想要的功能模块。下面就是Discuz自定义DIY调用模块二次开发的详细介绍。

首先来看下效果:我将自己的文件写在了其他模块的下面:
01.jpg
模块开发一定要遵循Discuz开发规则,按照Discuz规定的一些规则进行开发:
Discuz的所有的模块全部在:source/class/block文件夹下,看下对应的文件就明白了
02.jpg
这时差不多明白一点了吧。

接下来我们在其它类中自定义一个咱们自己的吧!


我现在other文件夹下新建一个block_othernew.php命名的文件必须为block_(自定义的名称).php这种格式。

其实你在新建一个文件也是可以的 ,可以参考other文件下面的文件,必须存在blockclass.php 这个文件,这个文件:
$blockclass = array(
'name' => lang('blockclass', 'blockclass_other'),//里面定义的就是语言包,就死上图中的 其他类,可以找下语言包中的这个字段,看下就明白了。
);
接着在block_othernew.php脚本文件中编写如下代码:
  1. if(!defined('IN_DISCUZ')) {
  2. exit('Access Denied');
  3. }


  4. class block_othernew extends discuz_block {


  5. function block_otherstat() {}
  6.    
  7. //模块名称 模块分类
  8. function name() {
  9. return "自己模块";
  10. }
  11. function blockclass(){
  12. //othernew 模块总分类
  13. return array('othernew', "模块杀手");
  14. }
  15.     //这个模块要返回的字段
  16. function fields() {
  17. return array(
  18. 'posts' => array('name' => lang('blockclass', 'blockclass_other_stat_posts'), 'formtype' => 'text', 'datatype' => 'int'),
  19. 'posts_title' => array('name' => lang('blockclass', 'blockclass_other_stat_posts_title'), 'formtype' => 'text', 'datatype' => 'string'),
  20. );
  21. }
  22. //设置需要帅选的参数 然后参数会自动传给  etdata($style, $parameter)
  23. function getsetting() {
  24. global $_G;
  25. $settings = array(
  26. 'titlelength' => array(
  27. 'title' => '傻了吧唧',
  28. 'type' => 'text',
  29. 'default' => ""
  30. )
  31. );
  32. return $settings;
  33. }
  34.         //返回数据的函数,自己发挥吧,一定要保证你返回的字段 在上个 fields 函数里面要有
  35. function getdata($style, $parameter) {
  36. global $_G;
  37. $parameter = $this->cookparameter($parameter);
  38. $fields = array(
  39. 'posts' => 0,
  40. 'posts_title' => !empty($parameter['posts_title']) ? $parameter['posts_title'] : lang('block/stat', 'stat_posts'),
  41. );
  42. if(in_array('posts', $parameter['option']) || in_array('bbsnewposts', $parameter['option'])) {
  43. $sql = "SELECT sum(f.posts) AS posts, sum(f.todayposts) AS todayposts FROM ".DB::table('forum_forum')." f WHERE f.status='1'";
  44. $forum = DB::fetch_first($sql);
  45. }
  46. if(in_array('posts', $parameter['option'])) {
  47. $fields['posts'] = intval($forum['posts']);
  48. }
  49. $list = array();
  50. return array('html' => '', 'data' => $list);
  51. }
  52. }


  53. ?>
复制代码
上面的类中的函数必须有,缺少一个不可,然后在Discuz管理后台 更新一下工具->更新缓存-> DIY 模块分类缓存,更新一下缓存就可以了,这时去后台和前台看下有没有吧。

要是想要调用最好先在后台为你的模块添加模板:

门户->模板模块->添加 ,选中你刚才自定义的模块,点击提交,看下图:看看里面的字段,是不是和你定义的类中fields 函数里面的字段是一样的吧!
03.jpg
添加模板,添加好之后,就可以去DIY了,去试试吧!
如果想更深入的了解Discuz DIY工作原理,可以看下blockclass_cache()函数,相信会给你更深入的收获。
在这个source/function/function_block.php文件中:
  1. function blockclass_cache() {
  2.         global $_G;
  3.         $data = $dirs = $styles = $dataconvert = array();
  4.         $dir = DISCUZ_ROOT.'/source/class/block/';
  5.         $dh = opendir($dir);
  6.         while(($filename=readdir($dh))) {
  7.                 if(is_dir($dir.$filename) && substr($filename,0,1) != '.') {
  8.                         $dirs[$filename] = $dir.$filename.'/';
  9.                 }
  10.         }
  11.         ksort($dirs);
  12.         foreach($dirs as $name=>$dir) {
  13.                 $blockclass = $blockconvert = array();
  14.                 if(file_exists($dir.'blockclass.php')) {
  15.                         include_once($dir.'blockclass.php');
  16.                 }
  17.                 if(empty($blockclass['name'])) {
  18.                         $blockclass['name'] = $name;
  19.                 } else {
  20.                         $blockclass['name'] = dhtmlspecialchars($blockclass['name']);
  21.                 }
  22.                 $blockclass['subs'] = array();

  23.                 $dh = opendir($dir);
  24.                 while(($filename = readdir($dh))) {
  25.                         $match = $infos = $oneinfo = $fieldsconvert = array();
  26.                         $scriptname = $scriptclass = '';
  27.                         if(preg_match('/^(block_[\w]+)\.php$/i', $filename, $match)) {
  28.                                 $scriptclass = $match[1];
  29.                                 $scriptname = preg_replace('/^block_/i', '', $scriptclass);
  30.                                 include_once $dir.$filename;
  31.                                 if(class_exists($scriptclass, false)) {
  32.                                         $obj = new $scriptclass();
  33.                                         if(method_exists($obj, 'name') && method_exists($obj, 'blockclass') && method_exists($obj, 'fields')
  34.                                                         && method_exists($obj, 'getsetting') && method_exists($obj, 'getdata')) {
  35.                                                 if($scriptclass == 'block_xml') {
  36.                                                         foreach($obj->blockdata as $one) {
  37.                                                                 $oneinfo['name'] = dhtmlspecialchars($one['data']['name']);
  38.                                                                 $oneinfo['blockclass'] = array($one['id'], $oneinfo['name']);
  39.                                                                 $oneinfo['fields'] = dhtmlspecialchars($one['data']['fields']);

  40.                                                                 foreach($one['data']['style'] as $value) {
  41.                                                                         $arr = array(
  42.                                                                                 'blockclass'=>'xml_'.$one['id'],
  43.                                                                                 'name' => dhtmlspecialchars($value['name']),
  44.                                                                         );
  45.                                                                         block_parse_template($value['template'], $arr);
  46.                                                                         $styles[$arr['hash']] = $arr;
  47.                                                                 }
  48.                                                                 $infos[] = $oneinfo;
  49.                                                         }
  50.                                                 } else {
  51.                                                         $oneinfo['name'] = $obj->name();
  52.                                                         $oneinfo['blockclass'] = $obj->blockclass();
  53.                                                         $oneinfo['fields'] = $obj->fields();
  54.                                                         $infos[] = $oneinfo;
  55.                                                 }
  56.                                         }
  57.                                         if(method_exists($obj, 'fieldsconvert')) {
  58.                                                 $fieldsconvert = $obj->fieldsconvert();
  59.                                         }
  60.                                 }
  61.                         }
  62.                         foreach($infos as $info) {
  63.                                 if($info['name'] && is_array($info['blockclass']) && $info['blockclass'][0] && $info['blockclass'][1]) {
  64.                                         list($key, $title) = $info['blockclass'];
  65.                                         $key = $name.'_'.$key;
  66.                                         if(!isset($blockclass['subs'][$key])) {
  67.                                                 $blockclass['subs'][$key] = array(
  68.                                                         'name' => $title,
  69.                                                         'fields' => $info['fields'],
  70.                                                         'script' => array()
  71.                                                 );
  72.                                         }
  73.                                         $blockclass['subs'][$key]['script'][$scriptname] = $info['name'];
  74.                                         if(!isset($blockconvert[$key]) && !empty($fieldsconvert)) {
  75.                                                 $blockconvert[$key] = $fieldsconvert;
  76.                                         }
  77.                                 }
  78.                         }
  79.                 }

  80.                 if($blockclass['subs']) {
  81.                         $data[$name] = $blockclass;

  82.                         $blockstyle = array();
  83.                         if(file_exists($dir.'blockstyle.php')) {
  84.                                 include_once($dir.'blockstyle.php');
  85.                         }
  86.                         if($blockstyle) {
  87.                                 foreach($blockstyle as $value) {
  88.                                         $arr = array(
  89.                                                 'blockclass'=>$name.'_'.$value['blockclass'],
  90.                                                 'name' => $value['name']
  91.                                         );
  92.                                         block_parse_template($value['template'], $arr);
  93.                                         $styles[$arr['hash']] = $arr;
  94.                                 }
  95.                         }
  96.                 }

  97.                 if(!empty($blockconvert)) {
  98.                         $dataconvert[$name] = $blockconvert;
  99.                 }

  100.         }

  101.         if($styles) {
  102.                 $hashes = array_keys($styles);
  103.                 foreach(C::t('common_block_style')->fetch_all_by_hash($hashes) as $value) {
  104.                         unset($styles[$value['hash']]);
  105.                 }
  106.                 if($styles) {
  107.                         C::t('common_block_style')->insert_batch($styles);
  108.                 }
  109.         }
  110.         savecache('blockclass', $data);
  111.         savecache('blockconvert', $dataconvert);
  112. }
复制代码
希望对每个Discuz开发都有所帮助。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|蓄财网 ( 豫ICP备2021002293号 )

GMT+8, 2021-6-17 02:06 , Processed in 0.092569 second(s), 27 queries .

蓄财网 ©版权所有

© 2021 蓄财网(www.aixc.cn)

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