DNN使用及思考
对DNN的使用经验(包括核心模块的使用教程)及其对DNN在国内运用的一些零碎思考,让DNN能够真正的火起来
读过武侠小说的你一定都知道古龙曾有一部著名的小说<<七种武器>>,其中列举了当今武林最牛的,杀伤力最大的武器,其中包括长生剑、孔雀翎、碧玉刀、多情环、霸王枪、离别钩、拳头.后来还有百晓生的兵器排行榜,其中就包括小李飞刀等等.在此我就班门弄斧了,借着古代利器之说,姑且列举一些对DNN模块开发起决定作用的一些方法或类,并辅助说明使用方式(排名没有先后之分,纯粹用于标识):
1) PortalModuleBase
所属命名空间:DotNetNuke.Entities.Modules
这是一个开发DNN模块所必须继承的基类,标志性的基类,在此基类中,你可以得到DNN所为你封装的一些模块基本信息,毋需你多费周折,其中包括当前用户UseID,UserInfo,TabID,ModulePath,ModuleConfiguration,LocalResourceFile等等,下边就简单解析几个比较有用的属性:
<1> ModulePath: 模块根目录,可以获取到模块根目录所需要的文件,比如脚本文件,图像文件,比如你想在后台注册一个js脚本,代码可以类似:
ScriptManager scriptManager = ScriptManager.GetCurrent(Page);
scriptManager.Services.Add(new ServiceReference(this.ModulePath + "WebService.asmx"));
scriptManager.Scripts.Add(new ScriptReference(this.ModulePath + "js/Utility.js"));
<2> LocalResourceFile: 本地化资源文件,默认是关联到模块根目录下的App_LocalResources下对应文件,比如你开发的模块用户控件为xx_view.as ...
Read the rest of entry »
自从DNN发布以来,用户对DNN皮肤机制一直以来都是褒贬不一,我对此也曾写过一些文章分析其中道理,有兴趣者不妨看看我之前的文章,目前DNN即将升级到5.0版本(代号为Cambrian),这将是一个具有里程碑意义的版本发布,时间大概是今年秋天,估计应该是在DotNetNuke OpenForce '08 大会之前吧,让我们拭目以待吧. 关心DNN皮肤的朋友们, 现在让我们先来看看皮肤机制将发生哪些变化...
Read the rest of entry »
上一篇文章简单解析了DNN多语言解决方案,其中提到了一个皮肤级别的本地化支持.这篇文章接着简单分析如何定制开发自己的皮肤对象(在dnn称之为Skin Objects),不妨来看看我们如何给DNN默认的登陆注册链接皮肤对象做个小变身.首先还是先描述一下需求,例如有客户需要在设计皮肤时可以在登陆注册这两个链接增加一个小图象提示,起到修饰美观的作用,最终效果如图:
如何开发呢?其实对我来说,开发DNN的原则就是如何节省代码量,同时可以让DNN物尽所用,但又不能影响以后的升级.我想这个理念在前几篇文章都阐述得淋漓尽致(比如浅谈如何做到dnn物尽所用(二), 浅谈如何做到dnn物尽所用).有兴趣者不妨回头看看,也许你也会得到些许提示的.回到正题,首先我想到就是利用原有的登陆注册这两个链接皮肤对象,再结合DNN自带的CommandButton(文章"再谈dnn的物尽所用(三)"对此有所解析)这一用户控件就可以实现我们的需求了.那我们就开始吧,还是我之前提到开发皮肤对象的步骤:
1) 在网站根目录下的admin/Skins文件夹里创建一个UserControl,比如现在新增dnnsunUser.ascx和dnnsunLogin.ascx(请注意该文件夹下的代码不需要重新编译,如果你是以站点形式发布的).
2) 创建对应的资源文件(dnnsunUser.ascx.resx, dnnsunUser.ascx.zh-CN.resx及其dnnsunLogin.ascx.resx,ascx.resx, dnnsunLogin.ascx.zh-CN.resx)
其中上述步骤你可以直接拷贝默认的登陆注册链接皮肤对象,然后重命名即可.接下来就是替代我们即将加入的CommandButton,在页面中注册并添加实例:
dnnsunLogin.ascx
@ Register TagPrefix="dnn" Assembly="DotNetNuke" Namespace="DotNetNuke.UI.WebControls" %>
<dnn:CommandButton ID="cmdLogin" runat="server" CssClass="SkinObject" CausesValidation="false"/>
或
dnnsunUser.ascx
@ Register TagPrefix= ...
Read the rest of entry »
目前dnn多语言解决方案是我这段时间研究的重点, 我接下来也许会写几篇相关文章阐述这些问题.
切入正题, 本地化是ASP.NET的特性, 无疑dnn也会直接支持, 但是事实上并不是很乐观, 因为dnn本身也只是在表面上作些文章吧了, 如果你想利用dnn实现多语言门户(Portals), 那你可能想错了, 除非你重新开发或在模块级别上定制的开发支持多语言. 那dnn究竟支持多语言到何种程度呢? 让我慢慢道来, 其实dnn默认支持的多语言只局限于页面标签(Tags,Token etc), 比如登陆链接, 编辑模块时的字段Label等等, 而这些并非我们通常理解的内容本地化(多语言支持). 当然你可以通过下列两种解决方案来实现:
1) 模块级别的多语言开发,但你的内容可能需要存储好几个版本(根据你站点支持的语言总数) 2) 站点级别的多语言开发,也就是你需要发布好几个站点(根据你需要支持的语言总数)目前在DNN模块市场也有一些模块按照第一种思路做到了内容上支持多语言,比如:1) MLSkinHelper, PageLocalization Module,Language Selector skin object 等等http://www.apollo-software.nl/Home/tabid/36/language/en-US/Default.aspx最经典的范例就是http://declic-video-fx.com/,它利用apollo-software相关模块实现了多语言站点,可以说基本上实现了多语言支持的所有功能.2) Localization Extensions: Easily implement multilingual portals http://www.adequation-dotnetnuke.com/en/AboutUs.aspx该站点的公司主页就是利用来实现了多语言支持,请访问http://www.adequation-informatique.com/en/Home.aspx3) 这是一个免费的模块Magic Content,同时也是DNN Forget下的一个新模块,该模块属于proeder.network.consult公司.Magic Content is a multi-lingual content publishing module for the DotNetNuke ...
Read the rest of entry »
如题目所言, 你在为寻找dnn资源而发愁么?苦于搜索好些时候也没找到自己所遇到问题的合适解决方案, 其实对我个人所言, 如果你想查找dnn资源, 毕竟还是国外资源要比国内资源丰富得多, 时效性也好些,故此我推荐大家如果有点耐性的话不妨多看看国外的DNN资源, 我想这对你的dnn之旅会受益不少. 在此我推荐一个专门针对dnn资源搜索的网站, 你可以比较有针对性的获取到纯"DNN" 的第一手资源, 也许里边就有你想要的解决方案, 同时它也提供了一些有效获取dnn资源的途径:
本着资源共享的原则,我在此先给大家拿出第一份礼物(也作为即将到来的全国第一个五一小假的纪念 :)
Read the rest of entry »

在一个QQ群里,总是不断有新人进来,就好比dnn社区,也不断会有新手进来,这不可避免出现老是不断的问同一个问题的状况,在此我想创建一个专门共享资源的群区,大家可以在此分享自己的DNN资源,积少成多,我想最终我们大家都会受益匪浅的.这样就有DNNSUN讨论区(群号:60930597)的创建,哪位有兴趣者不妨加入,但有一个小小要求,希望你不是那种只顾索要资源的类型,而是真正的发扬资源共享精神的一分子. 当然因为DNN本源就是开源的,所有我们在此更多的是推广DNN的非商业运用及其资源收集.
如果你愿意分享的话,我会负责整理这些资源,让大家一起受益,也让后来者感激不已的.当然我们团队也会收集所有关于dnn的资源发布在这里(或我们的站点
http://www.dnnsun.com)
目前我们的口号是:让我们一起努力,研究DNN的所有相关课题,希望给DNN在中国的广为人知贡献一点绵薄之力!
这篇文章将简单介绍如何使用和定制DNN里边的富文本编辑器(Rich TextEditor): FCKEditor
Read the rest of entry »

DotNetNuke OpenForce Is Back,After a highly successful OpenForce '07 it is now time to begin planning for OpenForce '08. We are currently working with our conference partners on the OpenForce '08 conferences. One of our first tasks is to start identifying our speakers.
Are you a DotNetNuke expert? Do you like to share your DotNetNuke knowledge with the community? Do you enjoy speaking in front of large crowds? You are exactly the person we are looking for.

当你的dnn站点在线运行了一段时间之后,你会发现速度在不断下降,加载页面很慢很慢,最后导致连自己都懒得访问了.这是为何呢?仔细寻找,你可能会发现数据库一直在膨胀,我想这就是站点变慢的罪魁祸首,在dnn中,如果你开启网站记录这一功能或某一任务调度,这些都会产生一堆的记录信息,久而久之就让你站点的数据库不断的膨胀. 你如果有条件或权限的话,你不妨到
主机管理/SQL服务或在SQL Manage里执行以下语句看看你的数据库大小都消耗在哪了:
sp_spaceused eventlog/sitelog/schedulehistory
我想到这你就应该很清楚我们下一步该怎么做,那就是把这些信息都清除了,减轻网站的页面加载压力. 当然,如果这些信息对你跟踪网站有用的话,那你只能继续你的”蜗牛之旅”了.下边列举两种方法可以清除这些记录.
1) 到网站管理/查看日志或网站记录等页面手动清除,这一方法的缺点就是你还是没法清除schedulehistory这一表里的数据.
2) 到主机管理/SQL服务下执行以下SQL脚本:
- TRUNCATE TABLE {databaseOwner}[{objectQualifier}eventlog]
- GO
-
- TRUNCATE TABLE {databaseOwner}[{objectQualifier}schedulehistory]
- GO
-
- TRUNCATE TABLE {databaseOwner}[{objectQualifier}sitelog]
- GO
-
- TRUNCATE TABLE {databaseOwner}[{objectQualifier}SearchItemWordPosition]
- GO
就我本地开发服务器上的dnn站点,原来备份数据有60M左右,清理之后我再备份就只有不大10M,我想这效果还是很显然的,所以不管是站点变慢了还是因为备份需要,我觉得我们都可以例时执行以上SQL脚本清理一下,这不失为一种策略.
在DNN使用中,我们可能有这样的需求,那就不想开放过多的权限给管理员以防止误删的事件,当然可能也有这样的需求, 增加某一个管理页面,对此的一般做法设置为管理员可见,这样就可以保证只有管理员才能查看和编辑这个页面,但是红色的边框提示确实比较难看,或许你需要把这个页面加入到admin或者host菜单,这样更方便管理和显得合理。在这里我们列举如何利用SQL Script来实现(当然也可能也有其他方法,但SQL应该是比较方便和直接的,前提你具有host帐号权限),接下来我们就分别对这两种情况讲解.
注意:以下更改之后必须重启IIS方才生效。
1) 屏蔽某些管理页面,也就是隐藏这些页面,最简捷的解决方案就是把类似以下的脚本拷贝到 主机管理/SQL服务下 当作脚本执行即可隐藏这些页面,不过缺点也是明显,如果你直接拷贝原来的Url仍然可以访问这一页面,实质就是我们只不过玩弄一下技巧吧了,当然你也可以设置IsDeleted或DisableLink这一属性,这就可以彻底的防止通过Url访问了。
UPDATE {databaseOwner}[{objectQualifier}Tabs]
SET [IsVisible]='0' -- Apply to the admin tab to not show
WHERE tabid=52
2) 增加管理页面并加入网站管理或主机管理菜单中。
首先我们新建一个页面,要记得查看页面id并记录下来 ,页面权限为正常即可,不必设置为管理员可见,然后添加管理模块到该页面,之后把类似以下的脚本拷贝到 主机管理/SQL服务下 当作脚本执行即可完成把管理页面改到管理菜单下
UPDATE {databaseOwner}[{objectQualifier}Tabs]
SET [TabOrder]='10032',
[IsVisible]='1',
[PortalID]=0, -- the filed related to which portal the admin menu exist
[ParentID]='38',
[Level]='1', -- the filed is the menu level, 0 is 1st, 1 apply to 2st...
[TabPath]='//Admin//YourTabName', -- YourTabName is your tabName which you will insert into the admin menus
[IconFile]='yourTabimage src' -- this filed is optional
WHERE tabid=57
参数解析:
1) TabOrder: 站点管理菜单TabOrder值截止到10031,也就是说你可以用10032 10033 10034……
2) ParentID: ParentID的计算,站点ID为0时,ParentID为38,站点ID为1时,ParentID为56,站点ID为2时,ParentID为74,站点id加1,ParentID加18
portalid=0 ParentID=38
portalid=1 ParentID=56
portalid=2 ParentID=74
portalid=3 ParentID=92
……
这一方法待考证.
3) tabid: 你要加进管理菜单的页面的id
类似如果想要把管理菜单写入host菜单下,需要修改语句如下:
UPDATE {databaseOwner}[{objectQualifier}Tabs]
SET [TabOrder]='24',
[IsVisible]='1',
[PortalID]=null,
[ParentID]='7',
[Level]='1', -- the filed is the menu level, 0 is 1st, 1 apply to 2st...
[TabPath]='//Host//YourTabName', -- YourTabName is your tabName which you will insert into the admin menus
[IconFile]='yourTabimage src' -- this filed is optional
WHERE tabid=57
1) TabOrder: TabOrder主机管理菜单TabOrder值截止23,你可以用24 25 26……
2) PortalID: 主机管理菜单PortalID值不变,因为主机管理是全局的,故PortalID默认为NULL
2) ParentID: 类似PortalID,因为主机管理是全局的,故ParentID一般为7
3) tabid: 你要加进管理菜单的页面的id
当然还可以在Admin或者是Host菜单下添加二级管理菜单,只需要加上TabPath='//Admin//一级//二级//…',
在DNN中,模块开发的SQL脚本一般都是以.SqlDataProvider为后缀名,并且都带有模块的版本号,

如此DNN在模块安装过程会自动识别模块现有的版本及其即将更新的版本并自动执行对应版本的SQL脚本,从而达到更新数据库的目的。然而苦恼的是在IDE中,比如Visual Studio(其中包括2003,2005,2008)都不能有效的显示SQL智能提示及其关键字高亮,平常择中的办法就是先把后缀名为.SqlDataProvider的SQL脚本文件修改为.sql,然后发布的时候在改回来,这样显得比较麻烦,其实我们可以修改一下注册表让Visual Studio支持.SqlDataProvider为后缀名的文件,其实很简单,就是需要你去注册表里边增加一注册项,
请按照下列步骤操作(Visual Studio 2008为例):
1. 单击“开始”,单击“运行”,在“打开”框中键入 regedit,然后单击“确定”。
2. 找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Languages\File Extensions\.sql
3. 单击“文件”,然后单击“导出”。
4. 在“文件名”框中,键入用于保存包含原始注册表项的 .reg 文件的文件名,(比如sql)然后单击“保存”。
5. 用记事本或其他文本编辑器打开sql.reg,并把.sql更改为. SqlDataProvider,另存为SqlDataProvider.reg
6. 双击SqlDataProvider.reg导入注册表即可
接下来你打开某一个模块Project,你会发现凡是. SqlDataProvider后缀的脚本都可以关键字高亮,这就是你想要的。:)