博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
discuz代码解析(二、控制器与视图解析)
阅读量:4198 次
发布时间:2019-05-26

本文共 2792 字,大约阅读时间需要 9 分钟。

上接第一篇

home.php第10-24行,完成了一个应用的初始化,下面继续看第28-41行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$space
=
array
();
 
$mod
= getgpc(
'mod'
);
//接收$_GET['mod'],实际是该项目的控制器
if
(!in_array(
$mod
,
array
(
'space'
,
'spacecp'
,
'misc'
,
'magic'
,
'editor'
,
'invite'
,
'task'
,
'medal'
,
'rss'
,
'follow'
))) {
//设置允许的控制器
    
$mod
=
'space'
;
//默认为space个人设置
    
$_GET
[
'do'
] =
'home'
;
}
 
if
(
$mod
==
'space'
&& ((
empty
(
$_GET
[
'do'
]) ||
$_GET
[
'do'
] ==
'index'
) && (
$_G
[
'inajax'
]))) {
    
$_GET
[
'do'
] =
'profile'
;
//应该为控制器或者样式
}
$curmod
= !
empty
(
$_G
[
'setting'
][
'followstatus'
]) && (
empty
(
$_GET
[
'diy'
]) &&
empty
(
$_GET
[
'do'
]) &&
$mod
==
'space'
||
$_GET
[
'do'
] ==
'follow'
) ?
'follow'
:
$mod
;
define(
'CURMODULE'
,
$curmod
);
//设置常量
runhooks(
$_GET
[
'do'
] ==
'profile'
&&
$_G
[
'inajax'
] ?
'card'
:
$_GET
[
'do'
]);
//执行钩子
 

require_once libfile('home/'.$mod, 'module');//转向控制器,关于libfile函数可以参数我写的另一篇文章 discuz常用函数说明   这里的引用是 require_once ./source/module/home/home_$_GET['mod'].php

链接:home.php?mod=spacecp&ac=profile&op=contact

现在进入./source/module/home/home_spacecp.php

14行 require_once libfile('function/spacecp');引入./source/function/function_spacecp.php函数库文件

15行 require_once libfile('function/magic');引入./source/function/function_magic.php函数库文件

17-26行,设置了可用的$ac和$op;$ac为操作名,$op和方法名

下面进行了一些用户的判断,没登陆的跳转,获得语言包$navtitle = lang('core', 'title_setup');

61行 require_once libfile('spacecp/'.$ac, 'include');

引入 ./source/include/spacecp/spacecp_profile.php 第14行$profilegroup = C::t('common_setting')->fetch('profilegroup', true);查询common_setting表中skey为common_setting的值,返回反序列化后的值

22行设置了$_GET['op']允许的值。

23行读取$space = getuserbyuid($_G['uid']);用户信息

读取配置信息、缓存等信息

58-286行,处理if(submitcheck('profilesubmit')){提交的表单,使用submitcheck函数处理,在函数中使用helper_form::submitcheck来进行检查,这个类在./source/class/helper/helper_form.php中,有空细看下}

286-372行,处理elseif(submitcheck('passwordsubmit', 0, $seccodecheck, $secqaacheck))修改密码的提交表单

374-399行,刚打开时$_GET['op']=='passwod'时的初处理

399-468行,刚打开时$_GET['op']!='passwod'时的初处理

471行 include template("home/spacecp_profile");这里是引入模板,位置./template/default/home/spacecp_profile.htm

template函数在function_core.php,是模板解析的函数,在函数中638行中使用checktplrefresh函数来解析模板,将模板中的标签替换成PHP代码,在checktplrefresh函数中,第500行require_once DISCUZ_ROOT.'/source/class/class_template.php';$template = new template(); 实例化了template类,并使用parse_template来解析标签,template类第115行 fwrite($fp, $template);将解析完成的模板缓存到'./data/template/'.(defined('STYLEID') ? STYLEID.'_' : '_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php'文件。

好了,至此我们看清了控制器和视图的真面目,控制器依靠 require_once libfile()来引入需要的模块和操作,转向的控制器实际上是一些函数,而操作则是一些if条件。而视图则是通过template函数来实现的,内部使用了template对象来解析模板中的标签,并将解析好的模板保存为缓存文件这样控制器和视图便完成了,而模型则是使用C::t('表名')->操作名(参数);,具体的模型存在./source/class/table/table_表名.php,处理过程在上一章中做了介绍,大家可以回去看看。好了一个完整的流程已经走完了,下一章将会介绍一个简单的插件的写法,并自己增加一个操作

转载自:

 

你可能感兴趣的文章
软件项目管理的圣经--人月神话(下)
查看>>
敏捷软件开发模型--SCRUM
查看>>
使用MOCK对象进行单元测试
查看>>
什么是RIA
查看>>
Flex实现页面多态--state对象
查看>>
Flex自定义组件
查看>>
Flex使用BlazerDS实现客户端与服务端通信
查看>>
Flex精华摘要--如何开始
查看>>
Flex精华摘要--基本MXML功能
查看>>
Flex精华摘要--基本语法
查看>>
Flex精华摘要--使用AS脚本
查看>>
JMeter性能测试入门
查看>>
JMeter最常用的三种类型的压力测试
查看>>
Hibernate HQL 语法大全(上)
查看>>
Hibernate HQL 语法大全(下)
查看>>
深入Java事务的原理与应用
查看>>
JTA(XA)原理解析
查看>>
UltraEdit中使用正则表达式
查看>>
CSS单位和CSS默认值大全
查看>>
CSS核心--盒子模型
查看>>