无缝集成,重设菜单
简介:
==========
在SharePoint Portal Server 2003 (以下简称SPS2003)中,文件一般都是存放在文档库中的。如果我们需要改动这个文件的一些属性,或者是签入/签出/批准文件,都可以很方便地通过文件右边的下拉菜单来实现。
我们可以看看下面SPS2003默认的菜单。
但是,大家肯定会发现这样一个问题:默认提供的功能是有限的。如果我想要添加一些内容,那怎么来实现呢?SPS2003好像并没有提供这样的功能。
研究过SPS2003 SDK的开发人员可能会说:我知道!SDK中有一个方法,可以通过修改系统的配置文件来实现。
是的,SPS2003 SDK中确实有这种方法,详细内容清参考下面的链接:
但这种方法,有一些不方便的地方:
1. 需要改系统的文件,难度大而且有风险。
2. 一旦修改了系统文件,就是改动了配置信息。那么对所有的文档库,这个配置都将起作用。
3. 如果以后SPS2003有升级包,而升级包正好重写了这个文件,那么配置信息也就失效了。
那么,有没有一种简单的方法呢?有,这就是下面的信息要介绍的方法。^_^
原理:
=========
SPS2003中的文档库的菜单,其实是由客户端的Javascript生成的。在安装了SPS2003中文版的服务器上,我们可以在服务器的\Program Files\Common Files\Microsoft Shared\web server extensions\60\TEMPLATE\LAYOUTS\2052这个目录下面,找到ows.js这个文件(SDK中的方法,就是使用自己的js文件,来提供代码改动菜单)。
在ows.js文件中,有一个对应的AddDocLibMenuItems函数,这个函数的功能,就是生成下拉菜单了。AddDocLibMenuItems提供了一个钩子(hook),我们可以通过这个hook,来添加额外的菜单项。
AddDocLibMenuItems函数的一开始就是:
function AddDocLibMenuItems(m, ctx)
{
if (typeof(Custom_AddDocLibMenuItems) != "undefined")
{
if (Custom_AddDocLibMenuItems(m, ctx))
return;
}
…
}
这段代码会检查Custom_AddDocLibMenuItems有没有定义,如果定义了,那么就先调用。如果在一个包含文档库的页面上,实现了这个函数,那么我们就可以很容易地添加我们自己的菜单了。
同时,相信大家也会问:那我能不能自己重写整个AddDocLibMenuItems函数,我自己来实现整个菜单条。当然可以,只是这样改系统文件,就只能后果自负了;而且也不需要用这种方法来重写整个菜单项,具体后面我们就可以看到。J
实现:
========
知道了原理,接下来就是怎么做了。怎样才能把Custom_AddDocLibMenuItems的定义添加到包含文档库的页面上,而且又不会产生我们上面讨论的问题?
SPS2003提供了一种方面的方法来加这个信息:使用“内容编辑器Web部件”。“内容编辑器Web部件”允许我们把自己的HTML代码和脚本信息写到页面中。
我们可以使用下面的方法,来在文档库的菜单中添加一项:
1. 访问SPS2003门户网站的主页。
2. 在页面左边的动作列表中,点击“编辑页面”。
3. 在页面右上角,点击“修改共享网页”右边的下拉按钮,从弹出的菜单中选择“添加Web部件”,然后再选择“浏览”。
4. 从本门户网站库中,选中“内容编辑器Web部件”,拖到页面上。
5. 点击“内容编辑器Web部件”中的“打开工具窗格”,来编辑属性。
6. 从工具栏中,点击源编译器,然后输入下面的代码。
<script language="javascript">
function Custom_AddDocLibMenuItems(m, ctx)
{
var strDisplayText = "Say Hello World!";
var strAction = "alert('Hello World')";
var strImagePath = "";
// Add our new menu item
CAMOpt(m, strDisplayText, strAction, strImagePath);
// add a separator to the menu
CAMSep(m);
// false means that the standard menu items should also be rendered
return false;
}
</script>
7. 随后点击保存关闭文本输入窗口。
8. 在工具栏中,展开“布局”,把“在网页上显示”前面的勾去掉。这样,这个Web部件是隐藏的。
9.最后,在主页上再添加一个“文档库”(和添加“内容编辑器Web部件” 的方法一样) 。并且,通过点击“修改共享Web部件”,打开“文档库”的属性窗口,并把视图改为“所有文档”。
10. 浏览门户网站的主页。我们可以看到在文档的下拉菜单中,已经多了一项“Say Hello World!”。
代码分析:
==============
我们已经成功地添加了一项菜单选项。那么,我们添加的短短几行代码,究竟是什么意思?下面来仔细分析一下:
1. Custom_ AddDocLibMenuItems函数有两个参数:m和ctx。其中,m代表的是菜单这个对象本身;而ctx,则提供了关于这个Web请求的HTTP context信息。
2. 真正添加菜单项的,就是下面的函数:
CAMOpt(m, strDisplayText, strAction, strImagePath)
其中,strDisplayText是菜单项显示出来的名字;strAction是点击菜单项时,执行的javascript动作;strImagePath是和这个菜单项关联的图片的路径。
3. CAMSep的作用是插入一条分隔条。
4. 最后,函数的返回值是false。这就告诉系统,继续生成原来标准的菜单。如果返回值是true,那么意味着原来的菜单项不会再被添加进来了。这样,我们就可以实现自己重写整个菜单项了。
小结:
========
使用这种方法,我们可以非常容易地添加一项菜单项,增加额外的功能,这在我们实现自己的应用时,会比较有用。同时,对于Windows SharePoint Service的网站,这种方法也同样适用。但是,这种方法也有一个缺点:如果我们在一些没有办法添加Web部件的页面上,例如,直接访问文档库页面时,这种方法也无能为力了。
最后,SPS2003其实还提供了另外一个hook: Custom_AddListMenuItems。
下面是部分函数代码:
function AddListMenuItems(m, ctx)
{
if (typeof(Custom_AddListMenuItems) != "undefined")
{
if (Custom_AddListMenuItems(m, ctx))
return;
}
…
}
相信大家已经知道怎么做了。^_^
Comments
- Anonymous
August 29, 2004
最后一篇原来的老文章,以后要再接再厉,开始多加内容。 - Anonymous
September 02, 2004
非常有价值的文章! - Anonymous
September 03, 2004
谢谢,以后多交流。