请选择 进入手机版 | 继续访问电脑版

[discuz教程] discuz home模块的DIY功能分析

发表于 2020-4-4 23:46:52 mobankoudai 用户等级--管理员
HOME模块的DIY功能集中在两个文件。一个是source/function/function_space.php,另一个是source/language/lang_space.php。

function_space文件主要定义了所有的DIY模块的具体展现方式,以及布局方式,每个模块包含元素的显示模式。

1、getuserdefaultdiy()---组成DIY功能的现实比例和现实数据前台定义数组,返回前台页面。


1 function getuserdefaultdiy() {
2     $defaultdiy = array(
3             'currentlayout' => '1:2:1',
4             'block' => array(
5                     'frame`frame1' => array(
6                             'attr' => array('name'=>'frame1'),
7                             'column`frame1_left' => array(
8                                     'block`profile' => array('attr' => array('name'=>'profile')),
9                                     'block`myprofile' => array('attr' => array('name'=>'myprofile')),
10                                     'block`statistic' => array('attr' => array('name'=>'statistic')),
11                                     'block`album' => array('attr' => array('name'=>'album')),
12                                     'block`doing' => array('attr' => array('name'=>'doing'))
13                             ),
14                             'column`frame1_center' => array(
15                                     'block`feed' => array('attr' => array('name'=>'feed')),
16                                     'block`share' => array('attr' => array('name'=>'share')),
17                                     'block`blog' => array('attr' => array('name'=>'blog')),
18                                     'block`thread' => array('attr' => array('name'=>'thread')),
19                                     'block`wall' => array('attr' => array('name'=>'wall'))
20                             ),
21                             'column`frame1_right' => array(
22                                     'block`friend' => array('attr' => array('name'=>'friend')),
23                                     'block`visitor' => array('attr' => array('name'=>'visitor')),
24                                     'block`group' => array('attr' => array('name'=>'group'))
25                             )
26                     )
27             ),
28             'parameters' => array(
29                     'blog' => array('showmessage' => true, 'shownum' => 6),
30                     'doing' => array('shownum' => 15),
31                     'album' => array('shownum' => 8),
32                     'thread' => array('shownum' => 10),
33                     'share' => array('shownum' => 10),
34                     'friend' => array('shownum' => 18),
35                     'group' => array('shownum' => 12),
36                     'visitor' => array('shownum' => 18),
37                     'wall' => array('shownum' => 16),
38                     'feed' => array('shownum' => 16)
39             )
40     );
41     return $defaultdiy;
42 }


默认的布局currentlayout是:  (1:2:1)分left,center,right三块进行排列,每个区块包含不同的子模块,如果要在显示的时候把模块放置到其它的栏位,在这里修改下就可以。

定义前台的各模块的现实数量:parameters,该参数用来定义各模块在数据库中获取的数据条数,这里都已经定义好了每个模块的现实数量,如果要修改默认的条数,可以在这里修改好。



2、getuserdiydata($space)---加载DIY数据,判断是加载默认数据还是用户保存的数据。



function getuserdiydata($space) {
    $userdiy = getuserdefaultdiy();
    if (!empty($space['blockposition'])) {
        $blockdata = unserialize($space['blockposition']);
        foreach ((array)$blockdata as $key => $value) {
            if ($key == 'parameters') {
                foreach ((array)$value as $k=>$v) {
                    if (!empty($v)) $userdiy[$key][$k] = $v;
                }
            } else {
                if (!empty($value)) $userdiy[$key] = $value;
            }
        }
    }
    return $userdiy;
}



该方法用来加载用户进行DIY操作后的数据,注意这里先判断下是不是初次DIY,如果是初次DIY会首先加载默认数据进行处理。如果不是初次加载,在数据库中pre_common_member_field_home的表里有spacecss和blockposition两个字段,分别用来保存用户在进行DIY操作后的数据保存工作。一旦数据保存后,今后每次DIY的操作都会从这个表里加载数据。

3、getblockhtml($blockname,$parameters = array()) ---对加载的模块内容进行解析。

由于代码太长,我就不把代码贴出来了,主要功能是在上面方法的基础上完善模块具体信息的加载和解析功能。因为上面的方法都是进行模块布局的整理和操作,对于模块内部需要显示的数据以及如何布局需要通过这个函数进行操作。

blockname 定义了需要解析的模块名称

parameters 定义了前台对该模块显示数据的要求。

如果要在DIY页面中增加一个默认显示的模块,只需要在这个switch模块中新增加一个case就可以实现,不过需要在lang_space.php文件中加入该blockname。

4、getlayout($layout='')---定义各布局方式的现实宽度,长度任意auto




function &getlayout($layout='') {
    $layoutarr = array(
            '1:2:1' => array('240', '480', '240'),
            '1:1:2' => array('240', '240', '480'),
            '2:1:1' => array('480', '240', '240'),
            '2:2' => array('480', '480'),
            '1:3' => array('240', '720'),
            '3:1' => array('720', '240'),
            '1:4' => array('190', '770'),
            '4:1' => array('770', '190'),
            '2:2:1' => array('385', '385', '190'),
            '1:2:2' => array('190', '385', '385'),
            '1:1:3' => array('190', '190', '570'),
            '1:3:1' => array('190', '570', '190'),
            '3:1:1' => array('570', '190', '190'),
            '3:2' => array('575', '385'),
            '2:3' => array('385', '575')
    );

    if (!empty($layout)) {
        $rt = (isset($layoutarr[$layout])) ? $layoutarr[$layout] : false;
    } else {
        $rt = $layoutarr;
    }

    return $rt;
}



5、getblockdata($blockname = '')---这个方法很重要,因为他关系到DIY默认显示模块列表。

function getblockdata($blockname = '') {
    $blockarr = lang('space', 'blockdata');
    $r = empty($blockname) ? $blockarr : (isset($blockarr[$blockname]) ? $blockarr[$blockname] : false);
    return $r;
}
lang('space', 'blockdata')这里是从lang_space.php文件中寻找blockdata这个数据的定义,然后用循环把数据行成数据,最后用到该用的地方。在首次加载DIY模块的时候用到这个方法。
我这里定义的blockdata列表如下:
    'blockdata' => array('profile' => '宝宝头像', 'myprofile' => '宝宝档案', 'doing' => '记录', 'feed' => '动态',
                'blog' => '日志', 'album' => '相册', 'friend' => '好友',
                'visitor' => '最近访客', 'wall' => '留言板', 'group' => '我的'.$_G[setting][navs][3][navname],
                'share' => '分享', 'thread' => '主题', 'group'=>$_G[setting][navs][3][navname],'music'=>'音乐盒',
                'statistic' => '统计信息',
                'block1'=>'自由模块1', 'block2'=>'自由模块2', 'block3'=>'自由模块3',
                'block4'=>'自由模块4','block5'=>'自由模块5'),

这样空间的DIY功能部分就解析完成了。还有部分细节的东西需要自己在二次开发中进行摸索,总的来说DX1.5的代码封装和面向对象的coding方式比以前老版本都有了很大的进步,二次开发也方便。

回复

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表
本站不提供充值,如需金币请分享资源赚,没有源码分享的多来论坛发发贴就可以升级用户组免金币了鸭!各别源码说明中写着要钱钱就别问为啥不能下了鸭~