您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz!NT初始化过程代码分析
秦树琪2025-07-02Discuz教程已有人查阅
导读Discuz!NT论坛程序具有强大的配置功能 :从论坛的标题到论坛各个地方的显示,论坛模板的使用等等。要弄明白DNT页面的显示过程,首先应知道ASP.NET页面事件的引发顺序。
Discuz!NT论坛程序具有强大的配置功能 :从论坛的标题到论坛各个地方的显示,论坛模板的使用等等。
1、ASP.NET页面事件执行过程
要弄明白DNT页面的显示过程,首先应知道ASP.NET页面事件的引发顺序。今天刚到手一本书:《ASP.NET3.5SP1高级编程》,上边是这么列的:
2、DNT页面的初始化过程
下面就以论坛首页(forumindex.aspx)的显示过程看一下DNT页面显示时是怎样将配置应用到页面中的。
首先,看该页的第一行:
打开这个文件,可以看到这样的代码:
ShowPage函数是这样定义的:
GetSpacePerm()函数是个人空间使用的函数,与论坛内容关系不大,暂不做介绍。
3、ShowPage函数中完成的工作
在ShowPage()函数中,DNT将显示页面需要的配置信息和从数据库读取的用户信息加载到内存中,用于以后的显示。
(1)设置页面的名称
这些信息加载完之后,就可以在页面中显示了。
4、将页面显示出来(OnInit函数)
在 forumindex.aspx.cs的代码中没有一行是想浏览器输出的函数!加载了那么多信息之后,在哪显示呢?
打开文件首页的ASPX文件forumindex.aspx,可以看到字样的代码:
在OnInit()函数中DNT使用一个StringBuilder组织需要显示的内容,之后用Response.Write(templateBuilder.ToString());将内容输出到浏览器!
DNT的配置 功能都是在组织页面的这个StringBuilder中加入的!多完美!无缝加入!呵呵
附:关于DNT模板引擎的猜想
在OnInit()函数的执行过程中,DNT根据根据加载的信息,判断哪些内容是用户有权限查看的梦哪些内容用户没有权限查看。但像这样的写法实在是累,还容易出问题!看看DNT怎么做的吧:
(1)总体设计时,明确哪些功能是可配置的。同时也明确实现这些配置功能的类。
(2)写配置函数。
(3)由页面设计者和美工做好完全功能的页面。
(4)整合。从页面文件中读取每一行的内容,加入判断信息后,添加到页面类的OnInit()函数中。
教我C# 的那个同事说DNT的架构师很牛!我写页面这么做跟架构师有关吧,架构师在设计之初就想到了这些功能!
1、ASP.NET页面事件执行过程
要弄明白DNT页面的显示过程,首先应知道ASP.NET页面事件的引发顺序。今天刚到手一本书:《ASP.NET3.5SP1高级编程》,上边是这么列的:
(1)PreInit
(2)Init
(3)InitComplate
(4)PreLoad
(5)Load
(6)LoadComplate
(7)PreRender
(8)PreRenderComplate
(9)UnLoad
也就是说在页面的生命周期内,ASP.NET就是按照这个顺序来执行的。当然,Page类的构造函数是最先执行的!2、DNT页面的初始化过程
下面就以论坛首页(forumindex.aspx)的显示过程看一下DNT页面显示时是怎样将配置应用到页面中的。
首先,看该页的第一行:
<%@ Page Language="c#" AutoEventWireup="false" EnableViewState="false" Inherits="Discuz.Web.forumindex" %>
Inherits="Discuz.Web.forumindex":说明该页继承自Discuz.Web.forumindex这个类。这个类位于文件forumindex.aspx.cs中。打开这个文件,可以看到这样的代码:
public class forumindex : PageBase
PageBase 继承自Page类,是DNT所有页面的基类。在文件forumindex.aspx.cs的forumindex类中定义了一些变量和两个函数:ShowPage()和GetSpacePerm()ShowPage函数是这样定义的:
protected override void ShowPage()
{}
它重写了基类PageBase中的ShowPage()函数。前面说过,构造函数在所有函数前执行,而forumindex没有定义构造函数,初始化时将只执行基类的构造函数。而PageBase在构造函数中调用了ShowPage()函数,而派生类forumindex中覆盖了这个函数。所以forumindex中的ShowPage要在ASP.NET生命周期内的9个过程之前执行!GetSpacePerm()函数是个人空间使用的函数,与论坛内容关系不大,暂不做介绍。
3、ShowPage函数中完成的工作
在ShowPage()函数中,DNT将显示页面需要的配置信息和从数据库读取的用户信息加载到内存中,用于以后的显示。
(1)设置页面的名称
pagetitle = "首页";
(2)加载用户组信息
AdminGroupInfo admingroupinfo = AdminGroups.GetAdminGroupInfo(usergroupid);
(3)写Cookie
ForumUtils.WriteCookie("isframe", "1");
(4)获取在线列表信息
OnlineUsers.UpdateAction(olid, UserAction.IndexShow.ActionID, 0, config.Onlinetimeout);
(5)获取当前用户的用户信息
userinfo = Users.GetShortUserInfo(userid);
(6)获取前台板块列表谈出菜单
navhomemenu = Caches.GetForumListMenuDivCache(usergroupid, userid, config.Extname);
(7)获取论坛的统计信息
totalusers = TypeConverter.StrToInt(Statistics.GetStatisticsRowItem("totalusers"));//总用户
lastusername = Statistics.GetStatisticsRowItem("lastusername").Trim();//之后发表用户
lastuserid = TypeConverter.StrToInt(Statistics.GetStatisticsRowItem("lastuserid"));//之后注册用户
yesterdayposts = TypeConverter.StrToInt(Statistics.GetStatisticsRowItem("yesterdayposts"));//昨日发帖数
highestposts = TypeConverter.StrToInt(Statistics.GetStatisticsRowItem("highestposts"));//较高发帖用户
highestpostsdate = Statistics.GetStatisticsRowItem("highestpostsdate").ToString().Trim();//较高发帖日期
(8)获取在线用户列表
onlineuserlist = OnlineUsers.GetOnlineUserCollection(out totalonline, out totalonlineguest, out totalonlineuser, out totalonlineinvisibleuser);
(9)获取论坛公告
announcementlist = Announcements.GetSimplifiedAnnouncementList(nowdatetime, "2999-01-01 00:00:00");
announcementcount = announcementlist != null ? announcementlist.Rows.Count : 0;
(10)从数据库中加载广告信息
headerad = Advertisements.GetOneHeaderAd("indexad", 0); //获取头部广告
footerad = Advertisements.GetOneFooterAd("indexad", 0); //获取底部广告
inforumad = Advertisements.GetInForumAd("indexad", 0, topforum, templatepath); //获取分类间广告
pagewordad = Advertisements.GetPageWordAd("indexad", 0); //获取页内文字广告
doublead = Advertisements.GetDoubleAd("indexad", 0); //对联广告
floatad = Advertisements.GetFloatAd("indexad", 0); //浮动广告
mediaad = Advertisements.GetMediaAd(templatepath, "indexad", 0); //Silverlight广告
广告方式还真多。这些信息加载完之后,就可以在页面中显示了。
4、将页面显示出来(OnInit函数)
在 forumindex.aspx.cs的代码中没有一行是想浏览器输出的函数!加载了那么多信息之后,在哪显示呢?
打开文件首页的ASPX文件forumindex.aspx,可以看到字样的代码:
<script runat="server">
override protected void OnInit(EventArgs e)
{
}
</script>
OnInit对应于页面生命周期中的Init过程。DNT的PageBase类和其他页面类均有这样的函数。这个函数主要用于根据刚才加载的信息,向浏览器输出内容。在OnInit()函数中DNT使用一个StringBuilder组织需要显示的内容,之后用Response.Write(templateBuilder.ToString());将内容输出到浏览器!
DNT的配置 功能都是在组织页面的这个StringBuilder中加入的!多完美!无缝加入!呵呵
附:关于DNT模板引擎的猜想
在OnInit()函数的执行过程中,DNT根据根据加载的信息,判断哪些内容是用户有权限查看的梦哪些内容用户没有权限查看。但像这样的写法实在是累,还容易出问题!看看DNT怎么做的吧:
/*
This page was created by Discuz!NT Template Engine at 2025-6-22 17:25:18.
本页面代码由Discuz!NT模板引擎生成于 2025-6-22 17:25:18.
*/
人家有模板引擎,自动生成的!我在想,为什么它能自动生成呢?因为DNT的一切配置信息预先都设置好了。调用方法明确,函数名称清晰稳定。不需要再更改什么了!所以页面生成整个过程可能是这样的:(1)总体设计时,明确哪些功能是可配置的。同时也明确实现这些配置功能的类。
(2)写配置函数。
(3)由页面设计者和美工做好完全功能的页面。
(4)整合。从页面文件中读取每一行的内容,加入判断信息后,添加到页面类的OnInit()函数中。
教我C# 的那个同事说DNT的架构师很牛!我写页面这么做跟架构师有关吧,架构师在设计之初就想到了这些功能!
本文标签:
很赞哦! ()
上一篇:Discuz论坛搭建步骤方法教程
下一篇:discuz登录流程分析
相关教程
图文教程
discuz建站步骤教程
买了域名A,又买了虚拟主机B,悔不当初的是B还免费送域名。各种失败尝试就不说了,反正折腾了整天终于通了。主机是cPanel图形化管理器,虽然说很方便,但绑定起来还是很多问题要注意的。
Discuz目录结构分析
admin.php-后台入口文件;api.php-合作API输出接口文件;connect.php-云平台接口文件cp.php-多应用服务入口文件(加载userapp.php文件);crossdomain.xml
Discuz!NT控件剖析ColorPicker(颜色拾取) 和Calendar(日历)开发
继上篇文章之后(链接),大家给了一些反馈和意见,有些BUG和不当之处我已修正,将会在2.0正式版本中提供给大家。希望大家能继续支持我们这个开源项目。
discuz怎么添加广告位?discuz自定义广告位的方法
自定义广告位方法可以在页面的任意位置添加广告位,系统广告位位于 source/class/adv/ 目录中,插件广告位位于 source/plugin/插件目录/adv/ 目录中。
相关源码
-
(自适应)宽屏大气的净水器智能电子设备网站pbootcms源码下载本模板基于PbootCMS内核开发,为净水器设备、智能电子设备企业量身打造,采用响应式设计技术,可快速构建专业级企业官网。通过本模板可高效展示产品技术参数、解决方案及企业服务优势。查看源码 -
自适应建材瓷砖卫浴大理石类pbootcms网站模板源码下载为建材瓷砖、卫浴瓷砖企业打造的高端响应式门户模板,基于PbootCMS内核深度开发。采用前沿HTML5自适应架构,无缝兼容手机端触控交互与PC端展示场景。查看源码 -
(PC+WAP)红色厨具厨房用品设备pbootcms模板源码下载为厨具设备企业设计的响应式网站模板,采用PbootCMS内核开发,适用于商用厨房设备、家用厨具、厨房用品等企业展示。模板包含产品展示、新闻动态、案例中心等标准模块,助您快速搭建专业级行业网站。查看源码 -
(PC+WAP)房屋建造建筑工程房地产建材行pbootcms网站模板下载本模板基于PbootCMS内核开发,为房屋建造、建筑工程及房地产建材类企业设计。通过本模板可快速搭建具有行业特色的企业官网,只需替换文字与图片内容即可适配其他行业使用。查看源码 -
(自适应)html5中英双语通用机械设备pbootcms模板下载本模板基于PbootCMS内核精心开发,为机械设备制造企业量身打造。设计风格大气稳重,充分展现机械行业的专业特质与技术实力。采用HTML5技术构建,支持中英文双语切换,满足国际化业务需求。整站布局合理,充分展示企业产品、案例与服务,帮助访客快速了解企业核心优势。查看源码 -
(响应式)蓝色智能摄像头安防防盗电子设备免费pbootcms源码下载这是一款针对智能安防行业特点设计的网站模板,采用蓝色系配色方案,体现科技感和安全性。模板包含产品展示、解决方案、技术支持和新闻中心等核心模块,能够全面展示智能安防设备的技术特点和行业应用。查看源码
| 分享笔记 (共有 篇笔记) |
