摘要: 本blog已经好久没有更新了,但作者对dnn的热情仍然在,而且已有一定的成绩,那就是属于我们团队的站点www.dnnsun.com 的诞生 下边就是我最新的一些Blog文章,dnn爱好者不妨看看,一起分享:1) 你的dnn站点慢了么? 2) 如何定制dnn站点的网站管理和主机管理 3) 如何关联dnn脚本文件SqlDataProvider文件 4) 如何定制安装dnn 5) 再谈dnn的物尽所用(...阅读全文
posted @ 2008-04-08 23:18 Baldwin 阅读(645) 评论(0) 编辑
手机上发布的。
posted @ 2011-05-27 19:42 Baldwin 阅读(17) 评论(0) 编辑
目前dnn多语言解决方案是我这段时间研究的重点,我接下来也许会写几篇相关文章阐述这些问题.
我想本地化是ASP.NET的特性,无疑dnn也会直接支持,但是事实并不是很乐观,那是因为dnn本身也只是在表面上作些文章吧了,如果你想利用dnn实现多语言Portal,那你就错了,除非你重新开发或在模块级别上支持多语言.那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.aspx
3)这是一个免费的模块Magic Content,同时也是DNN Forget下的一个新模块,该模块属于proeder.network.consult公司.
Magic Content is a multi-lingual content publishing module for the DotNetNuke plattform that can be used as a replacement for the current Text/HTML module. It's very easy to use and extends content publishing by many useful features. * one edit tab for each portal locale * advanced edit tab for role based content management * newsletter tab for sending content out via e-mail * replacement token tab.
http://www.codeplex.com/MagicContent
http://www.portalfabrik.net/
相关链接:
How to localization with dnnMenu or solpartMenu?
http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/76/threadid/224072/scope/posts/Default.aspx
how to localization in skin?
http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/109/threadid/222245/scope/posts/Default.aspx

更多信息请查看http://www.dnnsun.com/Community/BaldwinsBlog/tabid/67/EntryID/36/Default.aspx
posted @ 2008-05-15 21:06 Baldwin 阅读(838) 评论(0) 编辑

     先简单介绍一下dnn里边的富文本编辑器(Rich TextEditor)的渊源,也就是我们常说的web在线编辑器,最先dnn版本是集成了FreeTextbox的,但后来由于FreeTextbox商业化了,而且本身FreeTextbox也不是特别的好用,故由于dnn本身的开源性质,最终替换了如今的FckEditor,以下就是FckEditor的一些特性:
1) 多种浏览器兼容,其中包括IE 5.5+ (Windows), Firefox 1.0+, Mozilla 1.3+和Netscape 7+以上浏览器
2) 支持 XHTML 1.0
3) 支持CSS
4) 字体属性编辑
5) 剪切、粘贴、撤销、重复
6) 从word中粘贴文档并自动清理 格式
7) 插入图片,上传图片
8) 表格编辑
9) 插入表单域及其子元素
10) 支持右键菜单
11) 可定制工具栏
12) 皮肤支持
13) 插件(Plugins)模式支持
14) 拼写检查程序
15) 多语言支持以及自动用户语言侦查。
16) 轻量级和快速
17) 自动浏览器侦查和定制
18) 支持多种编程语言,其中包括ASP,CGI,PHP,ASP.NET,Java,ColdFusion,Python等脚本
19) 支持开发者安装和API编程
20) 简单易用! 
21) 开源
这里先着重提及如何定制dnn的FckEditor,在此之前先简单说明一下在dnn中FckEditor的目录结构,目前FckEditor在dnn是作为一个HtmlEditorProviders的形式出现的,也就是dnn已集成了FckEditor并为此提供一个默认的Providersl来管理,将来如果需要替换其他Providers的话也是及其方便的,我想这是dnn里Providers的魅力所在,开发过dnn的程序员都比较清楚,而其FckEditor的根目录就是$rootWebsite/Providers/HtmlEditorProviders/Fck,其中关系到我们如何定制FckEditor比较主要的目录就是默认的FCKeditor和dnn核心添加的Custom这两个目录,如果打开这两个目录看看,你就会比较清楚了,其实FCKeditor这里目录主要就是包含默认的FCKeditor所有的东西,比如skins,plugins,lang(语言包)等等,而Custom这是dnn对默认FCKeditor定制的一些修改配置.比如增加了dnn默认的编辑器工具栏属性:

FCKConfig.ToolbarSets["DNNDefault"= [
    [
'Source','Preview','-','Templates'],
    [
'Cut','Copy','Paste','PasteText','PasteWord','-','Print','SpellCheck'],
    [
'Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
    [
'Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
    [
'OrderedList','UnorderedList','-','Outdent','Indent'],
    [
'JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
    [
'Link','Unlink','Anchor'],
    [
'Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
    [
'Style','FontFormat'],['FontName','FontSize'],
    [
'TextColor','BGColor'],
    [
'FitWindow','-','About']
] ;
    更多信息... ( http://www.dnnsun.com/Community/BaldwinsBlog/tabid/67/EntryID/32/Default.aspx )
posted @ 2008-04-25 08:56 Baldwin 阅读(593) 评论(0) 编辑

因为继续研究Ajax Framework的原因,更多的接触了call和apply。
故再次论述call和apply,
1)无疑关于call,最简单的解释就是:把隐藏的第一个参数显示化。因为通常一个函数(Function)的调用,会有一个额外的隐藏参数,就是函数(Function)所属的对象(如果没有所特指,则为global(如window)对象),在函数内你可用this关键字访问之。
从call的构造式 -- call(thisArg[,arg1,arg2…] ]);可看出
call(apply)方法可将一个函数的对象上下文(Function Context)从初始的上下文改变为由 thisObj 指定的新对象,这就是利用call(apply)的最大优势。说到此,我们不妨提提所谓的Function Context到底是为何物。先看看下面FunctionContextDemo:

var changed={ item:"banana", act: "eating" };
var original={
        item: 
"chair",
        act: 
"sitting in",
        ask: 
function(){
              
return "who's been "+this.act+" my "+this.item;
        }
};
alert(
"Original : " + original.ask());
alert(
"Not so simple,that have been changed to: " + original.ask.call(changed));

解析上述代码:
最初存在2个对象changed和original,changed即就是一个数组,分别有item和act属性,而original除了具有和changed一样的item和act属性,还具有一个ask函数(询问到底是谁坐在椅子上),故当调用original.ask()时,可以看到意料中的结果:who's been sitting in my chair.而仔细往下看,当我们调用original.ask.call(changed)时,你觉得会出现什么的结果呢?在此,是利用了call把original的方法(函数)ask给与changed对象来执行,原来changed是没有ask方法(函数),如此绑定之后,函数的对象上下文(Function Context)即就是changed对象,故在方法(函数)ask里所调用的this就应该是changed对象,则可推知original.ask.call(changed)的结果应该是:who's been eating my banana.

通过FunctionContextdemo例子可看出如果我们需要在编程过程中需要替换函数的对象上下文(Function Context),call就是不错的选择。
你可以试着把FunctionContextdemo例子修改如下,再看看是什么结果:
var changed={ item:"banana", act: "eating" };
var original={item: "chair",act: "sitting in"};
function ask(){
   return "who's been "+this.act+" my "+this.item;
}
alert("Original : " + ask.call(original));
alert("changed: " + ask.call(changed));

2)javascript如何利用call来模拟面向对象中的继承的,而且可以实现多重继承

// 多重继承
function base1() {
    
this.member = " base1_Member";
    
this.showSelf = function() {
        window.alert(
this.member);
    }
}
function base2() {
    
this.person = " base2_Member";
 
this.act = " is dancing happily";
    
this.showAction = function() {
        window.alert(
this.person + this.act);
    }
}
function extend() {
    base1.call(
this);
    base2.call(
this);
}
window.onload
=function(){
   
var demo = new extend();
   demo.showSelf();
   demo.showAction();
}

但仔细深入看看,这样的继承是有问题的,直接在类函数体里面定义成员方法,将导致每个实例都有副本,重复占用了内存。
最为优雅简洁的方式应该算是基于原型(prototype)继承。
3)接下来我们再次来看看javascript框架prototype里是如何利用apply来创建一个定义类的模式:
var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
};
解析:
从代码看,该对象仅包含一个方法:Create,其返回一个函数,即类。但这也同时是类的构造函数,其中调用initialize,而这个方法是在类创建时定义的初始化函数,如此就可以实现prototype中的类创建模式.目的是规定如此一个类创建模式,让类的初始化函数名一定是initialize(),而this.initialize.apply(this, arguments);(令人有些费解)则是保证initialize一定会在类的实例创建后调用,既方便管理又体现Object-Oriented的思想。

注意: 里边的this其实是同一对象,即相当于类本身调用自己的构造函数来创建Class对象! 因为apply方法的第二个参数本身要求是一个数组,所以传递给该函数的参数也传递给类的initialize方法,如果直接写为 this.initialize(arguments); 则所有的参数是作为一个数组传递给了initialize构造函数。

var vehicle=Class.create();
vehicle.prototype
={
    initialize:
function(type){
        
this.type=type;
    }
    showSelf:
function(){
        alert(
"this vehicle is "+ this.type);
    }
}

var moto=new vehicle("Moto");
moto.showSelf();

4) 活用apply(javascript框架prototype的事件绑定):
Function.prototype.bind = function() {
  var __method = this; 
  var args = $A(arguments); 
  var object = args.shift();
  return function() { 
    // 调用函数的apply方法执行函数, 其中的object为目标对象, args为bind方法中的参数列表(除了第一个参数以外的参数构成的数组)
    return __method.apply(object, args.concat($A(arguments)));// 事实上, 这里的$A(arguments)一定是一个空数组
  }
}
代码解析:
该bind用途在于将某个函数绑定到特定的函数去执行,
a) var __method = this;这首先把Function Context重新赋值到一个本地变量,使得在Closure(这是一个javascript的特性,可解释为"闭包")中都能访问到,如此在下边就可以方便获取了。它实质就是bind方法的调用者, 是一个函数对象。
b) var args = $A(arguments);这里因为arguments本就是一个类数组的对象,通过$A(arguments)将传入到bind方法的参数都转化为array.
c) var object = args.shift();通过截取args的第一个参数获取Target Object(目标对象),此时args为除了第一个参数以外的参数构成的数组(array)
d) 这是最关键的一步,返回一个新的函数对象(不带有任何的参数的函数),在此通过apply把__method(bind方法的调用者)绑定到Target Object(目标对象),并给与除了Target Object(目标对象)之外的所有参数构成的数组args.concat($A(arguments)),最终Target Object(目标对象)就可执行__method了。
如此费劲周折的绑定某一个函数所换来的优势是,从此你不需要顾及Function Context的混乱所带来的额外顾虑。

posted @ 2007-06-26 19:31 Baldwin 阅读(1617) 评论(7) 编辑
摘要: DNN Extendable Module....阅读全文
posted @ 2007-06-21 09:47 Baldwin 阅读(1906) 评论(7) 编辑
摘要: 自从上次写了点关于ControlPanel的一些简单介绍后,由于懒惰的原因,一直没有在提笔写ControlPanel的研究心得了,惭愧啊!请参看ControlPanel研究系列一:简单引入控制窗格(ControlPanel)现在DNN已经升级到了4.4.0版本了,我只能奋起直追了,大家都知道,DNN在引入了asp.net 2.0框架后已经优化了很多,自然功能及其相关的业务更是有所完善了,Clien...阅读全文
posted @ 2007-01-17 22:25 Baldwin 阅读(2085) 评论(1) 编辑
摘要: 当你需要显示很多信息,可页面却再没有足够的空间可以容纳的时候,你一般会如何解决类似问题呢?或硬塞进页面而不管是否美观简洁么?还是就让用户不断拉动滚动栏而不管用户是否觉得麻烦?还是增建新页面而迫使用户去不耐烦在不同页面之间跳转呢?我想如果你使真的想作一个美观而简洁的Web网站的话,上述提到的想法应该在你脑海中一闪而过时就应该被否定的!而在同一个页面动态的显示信息的想法无疑是一个不错的主意,在此我提供...阅读全文
posted @ 2006-09-01 17:04 Baldwin 阅读(1435) 评论(7) 编辑
摘要: (注:在看到大家如此关注JS里头的这几个对象,我试着把原文再修改一下,力求能再详细的阐明个中意义 2007-05-21)在提到上述的概念之前,首先想说说javascript中函数的隐含参数:argumentsArguments该对象代表正在执行的函数和调用它的函数的参数。[function.]arguments[n]参数function :选项。当前正在执行的 Function 对象的名字。 n ...阅读全文
posted @ 2006-08-21 13:36 Baldwin 阅读(14418) 评论(25) 编辑
摘要: Eval()函数 这是我在学习找到的一篇简述Eval的文章,我在此转贴并加入一点自己的心得!在此谢谢原创者 该函数可以把一个字符串当作一个JavaScript表达式一样去执行它,具体来说,就是eval接受一个字符串类型的参数,将这个字符串作为代码在上下文环境中执行,并返回执行的结果。举个小例子:varthe_unevaled_answer="2+3";varthe_evaled_answer=ev...阅读全文
posted @ 2006-08-14 11:34 Baldwin 阅读(11524) 评论(9) 编辑
摘要: 数据库事务简介 数据库事务是由一组 SQL 语句组成的一个逻辑工作单元。您可以把事务看作是一组不可分的 SQL 语句,这些语句作为一个整体永久记录在数据库中或一并撤销。比如在银行帐户之间转移资金:一条 UPDATE语句将从一个帐户的资金总数中减去一部分,另一条 UPDATE语句将把资金加到另一个帐户中。减操作和加操作必须永久记录在数据库中,或者必须一并撤销 — 否则将损失资金。这个简单的示例仅使用...阅读全文
posted @ 2006-08-09 10:14 Baldwin 阅读(1150) 评论(0) 编辑
摘要: 记得之前老有人在论坛上问:到底RSS News模块如何使用,为啥总有一些Html的Tags呈现在页面,使得页面极为不美观,也不和谐,在这之前先要明白RSS其实是XML格式文件,具有自己element(即相对应的节点),类似下图:<?xmlversion="1.0"encoding="iso-8859-1"?><rssversion="2.0"><channel>...阅读全文
posted @ 2006-02-24 21:18 Baldwin 阅读(835) 评论(1) 编辑
摘要: 忙了好些时候了,现在该停下来写点东西了,这些期间补了好多课,有PS,有Flash等.....而这是我最新的Skin Products.... 还无法在网上发布,在准备建站中.....在此做些Demostration...Mobile_Portal:Baldwin_MMStoreCoffees_Store阅读全文
posted @ 2006-02-24 18:59 Baldwin 阅读(1108) 评论(4) 编辑
摘要: 前段时间写了几篇文章,大概把自己随意作的一些DNN皮肤经验共享了一下!还把一些皮肤提供下载!!详细信息不妨参看我之前的文章!现在准备陆续把之前在文章里展示的皮肤在此提供下载,让大伙享受DNN的无限魅力!似乎有些夸大了,但我还是很看好DNN的,它还有很大的扩展潜力,以后会更为完善的!!言归正传,再次提到皮肤,为了对刚开始接触的DNN新人,不妨对皮肤这一概念解释一下,这样使得对DNN皮肤有更详细的认知...阅读全文
posted @ 2005-10-21 09:54 Baldwin 阅读(1845) 评论(4) 编辑
摘要: 好久没来了!!呵呵,前段时间实在很忙!!现在总算轻松了些!!也在上次文章上增添了些新的皮肤,效果图都贴在原来文章里,有兴趣者不妨看看!整理好了我会提供下载给大伙,一起交流交流!!好运!好了,言归正传!!DNN调度解决方案是在DNN2.1.1开始引进的,它通过提供一个线程池管理调度任务来实现了多线程调度服务。该线程池允许可重用在池中现有的线程,而不需要杀死线程,即而生成新线程的无效率做法。无疑的,创...阅读全文
posted @ 2005-10-19 07:55 Baldwin 阅读(1678) 评论(7) 编辑