Condividi tramite


无缝集成,重设菜单

简介:

==========

在SharePoint Portal Server 2003 (以下简称SPS2003)中,文件一般都是存放在文档库中的。如果我们需要改动这个文件的一些属性,或者是签入/签出/批准文件,都可以很方便地通过文件右边的下拉菜单来实现。

我们可以看看下面SPS2003默认的菜单。

 

但是,大家肯定会发现这样一个问题:默认提供的功能是有限的。如果我想要添加一些内容,那怎么来实现呢?SPS2003好像并没有提供这样的功能。

研究过SPS2003 SDK的开发人员可能会说:我知道!SDK中有一个方法,可以通过修改系统的配置文件来实现。

是的,SPS2003 SDK中确实有这种方法,详细内容清参考下面的链接:

https://msdn.microsoft.com/library/default.asp?url=/library/en-us/spptsdk/html/tsptaddingcontextmenu.asp

但这种方法,有一些不方便的地方:

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;

}

}

相信大家已经知道怎么做了。^_^