Module_学习创建自己的模块

来源:百度文库 编辑:神马文学网 时间:2024/04/29 19:29:39
学习创建自己的模块
1、首先明白模块的构造,由view 和edit 用户控件,.dnn文件,.vb(.cs)编译成功的.dll文件,如果和数据库打交道,会有.SqlDataProvider。
2、引入 :Imports DotNetNuke  类继承:Inherits PortalModuleControl
3、首先要研究的类:DotNetNuke.ModuleController    PortalModuleControl
目录
DotNetNuke 3.0模块开发指导.. 1
目录.. 2
I序言.. 3
什么是模块? 3
模块容器.. 5
模块与DotNetNuke的接口.. 8
DotNetNuke结构.. 8
Provider 模式.. 9
文件夹结构.. 11
开始模块开发.. 12
配置你的 Visual Studio.NET项目.. 12
配置 DNN与你的控件通信.. 16
模块的结构.. 17
三层或者N层结构.. 18
一个页面多个控件.. 19
数据层.. 20
业务逻辑层 (BLL) 21
用户层.. 24
Physical物理数据库Providers 29
与 DNN交互.. 32
个性化.. 32
调度.. 33
事件记录 Provider 35
本土化.. 36
导入和导出.. 36
搜索.. 37
文本编辑器.. 38
DotNetNuke用户控件.. 38
错误传送.. 39
模块内部通信.. 39
部署你的模块.. 41
为部署创建数据库.. 41
创建你的部属定义.. 42
将你的模块打包.. 46
安装程序集 47
小结.. 47
DotNetNuke(DNN)从入门到进阶(1)-怎样写自己的模块
好久没有写DNN的技术文章了,这是DotNetNuke(DNN)从入门到进阶之怎样写自己的模块(Modules)。关于DNN的相关说明,可以参看我的DNN系列随笔。
从一个熟练的DNN开发者来说,写一个DNN模块没有任何难度,对一个新手来说,只需要依样画葫芦便可。在DNN2.x中,有不少内置的模块,大家只需要参考着做就可以了,需要注意的地方只有几个:
1、DNN是基于模块的,这意味着你开发的模块都必须使用Web Control(.ascx)并继承PortalModuleControl(DNN3.0更名为PortalModuleBase),这样你便可以直接得最常用的PortalID、ModuleID和PortalSettings等公用属性;
2、DNN是基于N-Tier的,分UI、BLL、DAL、DSL等四层,UI就是具体的Web Controls(*.ascx),BLL就是业务逻辑,DAL就是基于Provider模式的数据存取,DSL就是数据存储,根据实际情况可能是ACCESS、MS SQL、Oracle、MySQL等;
3、与其它多层引用不一样,DNN采用子引用父亲,也就是具体的功能模块引用DNN,而不是DNN引用具体的功能模块,这样的好处是:不管多少模块,内核仍然保持干净;坏处是:如果打包,会莫名其妙地很膨大,因为内心的所有程序集文件都编译到具体模块的bin目录下面了。
4、DNN推荐模块目录结构是:
Module Root
|--Components
|--Controls
|--功能A(包括UI和BLL,BLL中包括业务逻辑属性和数据存储实例类)
|--功能B
|--功能X
|--Providers\DataProvider\SqlDataProvider
其中Providers\DataProvider存放数据存取基类,Providers\DataProvider\SqlDataProvider存放MS SQL的数据存取继承类,而这个类是独立工程。
5、特别需要注意的是ModuleID,这是每个实例化模块的唯一标示,而通过ModuleID则可以获取TabID(我喜欢称之为栏目ID,而不是标签ID,感觉标签忒别扭)。
说了这么多,最容易的就是用现成的工具:DNNTemplate,安装之后就在VS.NET中添加了DNN Module、DNN SQLDataProvider DAL、DNN ACCESSDataProvider DAL、DNN SkinObject等4个项目模块,然后大家填写业务代码便可,实在方便,如图1。

(图1)
以下是我过去3个多月苦干的基于DNN开发EIP(企业信息门户)的核心系统CMS(内容管理系统)VS.NET解决方案,如图2:

(图2)
请到这里下载:DNNTemplate,这个工具支持VS.NET 2002/2003
下一章将深入介绍“我的模块”的具体实现。
DotNetNuke:如何创建自己的模块(FlashPlayer Module)
前言:很早的时候就想创建一个自己的模块,但由于受英文资料的限制,所以一直都没有动手,趁国庆长假这段时间,狠下心,硬着头皮总算看完了那几个英文资料的文章。,看了N久总算对创建模块有了大概了解,不过到了刚动手的时候又不知道如何下手,结果又去翻那几篇英文资料,又重新看了好几遍,又对DotNetNuke自带的模块进行小部分的研究,总算有点了解,让我们看看如何创建我们自己的模块吧(这回我会详细将步骤都写下来,不过再深入的我也没有进行研究,请自行查看它的代码)在此也感谢中国Rainbow
一,新建一个web application 应用程序项目,并将项目名称更为CnBlogs.FlashPlayer,并更改输出的程序集名称为:CnBlogs.FlashPlayer

二,添加引用DLL文件,DotNetNuke.dll,在数据库,自定义用户控件需要用到

三,为FlashPlayer新建用户控件(ASCX),名称为:FlashPlayer.ascx,EditFlashPlayer.ascx

为FlashPlayer.ascx放置一个label控件,并继承DotNetNuke.PortalModuleControl
Imports System.Text
Imports DotNetNuke
Namespace CnBlogsNamespace CnBlogs.FlashPlayer
    Public Class FlashPlayerClass FlashPlayer
        Inherits DotNetNuke.PortalModuleControl

#Region " Web 窗体设计器生成的代码 "

        ‘该调用是 Web 窗体设计器所必需的。
         Private Sub InitializeComponent()Sub InitializeComponent()

        End Sub
        Protected WithEvents Label1 As System.Web.UI.WebControls.Label

        ‘注意: 以下占位符声明是 Web 窗体设计器所必需的。
        ‘不要删除或移动它。
        Private designerPlaceholderDeclaration As System.Object

        Private Sub Page_Init()Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            ‘CODEGEN: 此方法调用是 Web 窗体设计器所必需的
            ‘不要使用代码编辑器修改它。
            InitializeComponent()
        End Sub

#End Region

        Private Sub Page_Load()Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ‘在此处放置初始化页的用户代码
        End Sub
    End Class
End Namespace
FlashPlayer.vb
 
 Private Sub Page_Load()Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ‘在此处放置初始化页的用户代码
            If Not IsPostBack Then
                Try
                    Dim swfFile As String = CType(Settings("movie"), String) ‘flash文件
                    If Not (swfFile Is Nothing) And swfFile <> "" Then
                        Dim StringFormat As StringBuilder = New StringBuilder("                        StringFormat.Append("codebase=""http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"" width={0} height={1}>")
                        StringFormat.Append("  ")
                        StringFormat.Append(" ")
                        StringFormat.Append("                          StringFormat.Append("  pluginspage=""http://www.macromedia.com/go/getflashplayer"" type=""application/x-shockwave-flash"">")
                        Label1.Text = String.Format(StringFormat.ToString, CType(Settings("width"), String), CType(Settings("height"), String), swfFile, swfFile)
                    End If
                Catch exc As Exception ‘Module failed to load
                    ProcessModuleLoadException(Me, exc)
                End Try
            End If

        End Sub
也许大家会有疑问:Settings("movie") 是从哪里来的?它的数据又是从哪里来的?
刚开始研究模块的创建我也有同样的疑问,而且造成这个疑问主要是因为DotNetNuke自带的模块都是为它们模块独立创建一张表,比如Links模块,它的表的名称就是:DNN_links,而造成这个问题也主要还是我对DNN的许多地方都没有研究过,后来在查看DotNetNuke.PortalModuleControl 对它也有了我妥
DotNetNuke的DesktopControls.vb 代码
Imports System
Imports System.Configuration
Imports System.Data
Imports System.IO

Namespace DotNetNukeNamespace CnBlogs.FlashPlayer

    Public Class PortalModuleControlClass PortalModuleControl
        Inherits UserControl
……
……
  _
        Public ReadOnly Property Settings()Property Settings() As Hashtable

            Get

                If _settings Is Nothing Then

                    _settings = PortalSettings.GetModuleSettings(ModuleId)
                End If

                Return _settings
            End Get

        End Property
 _
        Public ReadOnly Property PortalSettings()Property PortalSettings() As PortalSettings

            Get
                PortalSettings = CType(HttpContext.Current.Items("PortalSettings"), PortalSettings)
            End Get

        End Property
    End Class

End Namespace
上面的HttpContext.Current.Items("PortalSettings")是从global.vb 的Application_BeginRequest事件获得,它在整个网站的运行起到了模块分析,及其它数据的存储,也是核心的部分。它是分析url,将当页的所有模块信息都载入保存进来,请大家自已对这块内容研究,我好像在以前的随笔也有对这个进行简单的介绍
EditFlashPlayer.ascx
该控件主要是配置作用,比如SWF地址,高度(height),长度(width)……

EditFlashPlayer.ascx.vb
Namespace DotNetNukeNamespace DotNetNuke
    Public Class EditFlashPlayerClass EditFlashPlayer
        Inherits DotNetNuke.PortalModuleControl

#Region " Web 窗体设计器生成的代码 "

        ‘该调用是 Web 窗体设计器所必需的。
         Private Sub InitializeComponent()Sub InitializeComponent()

        End Sub
        Protected WithEvents LinkButton1 As System.Web.UI.WebControls.LinkButton
        Protected WithEvents txturl As System.Web.UI.WebControls.TextBox
        Protected WithEvents txtwidth As System.Web.UI.WebControls.TextBox
        Protected WithEvents txtheight As System.Web.UI.WebControls.TextBox

        ‘注意: 以下占位符声明是 Web 窗体设计器所必需的。
        ‘不要删除或移动它。
        Private designerPlaceholderDeclaration As System.Object

        Private Sub Page_Init()Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            ‘CODEGEN: 此方法调用是 Web 窗体设计器所必需的
            ‘不要使用代码编辑器修改它。
            InitializeComponent()
        End Sub

#End Region

        Private Sub Page_Load()Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ‘在此处放置初始化页的用户代码
            Try
                If Not IsPostBack = True Then
                    If ModuleId <> -1 Then ‘
                        Dim settings As Hashtable

                        ‘ Get settings from the database
                        settings = PortalSettings.GetModuleSettings(ModuleId)

                        txtUrl.text = CType(settings("movie"), String)
                        txtWidth.Text = CType(settings("width"), String)
                        txtHeight.Text = CType(settings("height"), String)
                    End If
                End If
            Catch ex As Exception

            End Try
        End Sub

        Private Sub LinkButton1_Click()Sub LinkButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
            Dim objModules As New ModuleController
            objModules.UpdateModuleSetting(ModuleId, "movie", txturl.Text)
            objModules.UpdateModuleSetting(ModuleId, "width", txtwidth.Text)
            objModules.UpdateModuleSetting(ModuleId, "height", txtheight.Text)
        End Sub
    End Class
End Namespace
        Public Sub UpdateModuleSetting()Sub UpdateModuleSetting(ByVal ModuleId As Integer, ByVal SettingName As String, ByVal SettingValue As String)

            Dim dr As IDataReader = DataProvider.Instance().GetModuleSetting(ModuleId, SettingName)

            If dr.Read Then
                DataProvider.Instance().UpdateModuleSetting(ModuleId, SettingName, SettingValue)
            Else
                DataProvider.Instance().AddModuleSetting(ModuleId, SettingName, SettingValue)
            End If
            dr.Close()

        End Sub
全部好了之后对编译,接下去的工作就是上传模块了,在上传模块之前我们需要配置一个文件。建立一个flashplayer.dnn文件。然后以host用户登陆后就可以上传模块了


    
        
            CnBlogs - FlashPlayer
            *** FlashPlayer ***
            01.00.00
            
                
                    CnBlogs - FlashPlayer
                    
                        
                            FlashPlayer
                            FlashPlayer.ascx
                            View
                        

                        
                            Options
                            Edit Flash Player
                            EditFlashPlayer.ascx
                            Edit
                        

                    

                

            

            
                
                    FlashPlayer.ascx
                

                
                    EditFlashPlayer.ascx
                

                
                    CnBlogs.FlashPlayer.dll
                


            

        

    




在第一次编写模块,发现将模块添加到页面上时会显示不出菜单,结果昨天晚上花了很长时间都没有解决。后来在中国Rainbow 的帮助下才找到问题的所在。
flashplayer.vb
  Private Sub Page_Init()Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
            ‘CODEGEN: 此方法调用是 Web 窗体设计器所必需的
            ‘不要使用代码编辑器修改它。
            InitializeComponent()
            MyBase.Actions.Add(GetNextActionID, "Options", "", URL:=EditURL(, , "Options"), secure:=SecurityAccessLevel.Edit, Visible:=True)
        End Sub
我看别人的代码有个毛病,从来会忘记page_init里的代码:( 看来以后要注意下自己的习惯了

后续:刚开始没有做过模块总以为创建模块是一件很困难的事,而且也没有中文资料,看了一些英文资料之后有无从下手的感觉。做这个模块我实际上做了三次,前二次做到一半就有疑问,下一步应该怎么走?我也无从得之,只好又删了文件又在重新看资料。还有一次就是刚建立了项目就不知道下手了:(
现在,自己在回头看看,实际上创建一个模块非常简单,因为DotNetNuke为你封装了许多方法,比如数据库的读取数据,更新数据等……国庆长假之后我可能对DotNetNuke的研究会少许多时间了,有可能都会没有精力再研究了
模块下载:http://www.cnblogs.com/Files/zc_net/FlashPlayer.zip
参考资料:
Creating a new DotNetNuke module in Visual Basic
DotNetNuke Module:DNN MP3 Player :)
扩展AdRotator控件,让它支持.SWF广告 (源码)
DotNetNuke:Package a new Module
posted on 2004-10-04 12:03小春 阅读(1889)评论(8)  编辑  收藏 所属分类:DotNetNuke