您现在的位置是:首页 > 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设置广告位及广告投放规则的方法
discuz论坛的广告设置和优化可以通过以下步骤实现:1. 设置广告位:通过后台管理界面选择广告类型和位置,如首页顶部的图片广告。2. 设定投放规则:3. 优化和监测:
Win下IIS+php+mysql+zend+discuz完整安装教程
Win下IIS+php+mysql+zend+discuz!完整安装图解版如果你的服务器上已经装好了iis的话这一步就可以省略。如果没有安装的话,按照下列步骤依次进行:
Discuz的NT负载均衡解决方案Linux Virtual Server
在DiscuzNT的较新版本(企业版)中,支持目前主流LINUX平台上的负载均衡解决方案,比如NGINX,HAPROXY,LVS等。本文与其说是解决方案
Discuz论坛搜索功能使用方法
Discuz论坛是一个基于PHP的开源社区软件,支持用户发帖、回帖、私信等功能。搜索功能是其中的一个重要模块,允许用户通过关键词、作者、时间等条件来查找帖子。
相关源码
-
(PC模板)工商公司注册会计财务记账pbootcms模板源码下载基于PbootCMS的工商财税行业网站系统,手工编写前端代码确保执行效率,双端自适应设计,支持后台实时更新服务价格和政策文件。查看源码 -
(PC+WAP)房屋建造建筑工程房地产建材行pbootcms网站模板下载本模板基于PbootCMS内核开发,为房屋建造、建筑工程及房地产建材类企业设计。通过本模板可快速搭建具有行业特色的企业官网,只需替换文字与图片内容即可适配其他行业使用。查看源码 -
(自适应响应式)超市仓储仓库货架展架网站pbootcms源码下载本模板为货架展架、仓储货架行业量身打造,采用PbootCMS内核开发,充分考虑了货架产品展示和企业形象展示的需求。模板设计简洁大方,突出产品特点,能够有效展示各类货架产品的规格参数和应用场景,帮助访客快速了解企业核心业务和产品优势。查看源码 -
(自适应响应式)房产合同知识产权企业管理pbootcms模板下载本模板基于PbootCMS系统开发,为知识产权服务、法律咨询及企业合同管理等行业设计。采用严谨专业的布局风格,突出法律文书与知识产权服务行业特色,适合展示各类法律服务和知识产权相关内容。查看源码 -
(PC+WAP)茶叶茶艺茶道茶文化pbootcms模网站源码下载本模板基于PbootCMS系统开发,为茶叶企业、茶艺培训机构设计,特别适合展示茶产品、茶道文化等内容。采用响应式技术,确保在不同设备上都能呈现优雅的茶文化氛围。查看源码 -
(自适应)pbootcms家政服务保洁保姆打扫卫生网站模板下载本模板基于PbootCMS内核开发,为家政服务企业量身定制。设计风格温馨亲切,突出家政行业的专业与贴心服务特性,多方位展示企业服务项目与优势。查看源码
| 分享笔记 (共有 篇笔记) |
