用脚本添加SharePoint列表MenuItems菜单

原文标题:无缝集成,重设菜单

转载备注:该文在MOSS2007下同样适用。

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

 

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

但是,大家肯定会发现这样一个问题:默认提供的功能是有限的。如果我想要添加一些内容,那怎么来实现呢?SPS2003好像并没有提供这样的功能。 研究过SPS2003 SDK的开发人员可能会说:我知道!SDK中有一个方法,可以通过修改系统的配置文件来实现。 是的,SPS2003 SDK中确实有这种方法,详细内容清参考下面的链接: http://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))           
            retur}

这段代码会检查Custom_AddDocLibMenuItems有没有定义,如果定义了,那么就先调用。如果在一个包含文档库的页面上,实现了这个函数,那么我们就可以很容易地添加我们自己的菜单了。 同时,相信大家也会问:那我能不能自己重写整个AddDocLibMenuItems函数,我自己来实现整个菜单条。当然可以,只是这样改系统文件,就只能后果自负了;而且也不需要用这种方法来重写整个菜单项,具体后面我们就可以看到。

 实现:

===== 知道了原理,接下来就是怎么做了。怎样才能把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,那么意味着原来的菜单项不会再被添加进来了。这样,我们就可以实现自己重写整个菜单项了。

小结: ===== p> 使用这种方法,我们可以非常容易地添加一项菜单项,增加额外的功能,这在我们实现自己的应用时,会比较有用。同时,对于Windows SharePoint Service的网站,这种方法也同样适用。但是,这种方法也有一个缺点:如果我们在一些没有办法添加Web部件的页面上,例如,直接访问文档库页面时,这种方法也无能为力了。

最后,SPS2003其实还提供了另外一个hook: Custom_AddListMenuItems。 下面是部分函数代码:

function AddListMenuItems(m, ctx)
{
    if (typeof(Custom_AddListMenuItems) != "undefined") 
    {
        if (Custom_AddListMenuItems(m, ctx))           
            return;
}

…
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值