Sharepoint2010-CustomAction之CopyListItem

SharePoint中一般用List 来存储数据,用Library来存储文件,最近做的项目中,由于List中的Column实在太多,每次填个表单都要花很多时间,用户也由此感受,每个单子中,很多信息都是一样的,如何才能实现快速填写表单呢? 

如果可以基于旧的表单复制一份,然后修改不同的信息,不就达到要求嘛。

SharePoint2010中的CustomAction+COM让这种想法成为可能。

先看效果(选中一条记录的时候,按钮才可用)


实现思路:获取选中Item的ID,然后根据ID可以获取当前Item,新建一个Item,将选中的Item信息赋给New Item.

实现步骤:

1.定义Action显示位置

 <CommandUIDefinition Location="Ribbon.ListItem.Manage.Controls._children">
          <Button Id="Ribbon.CustomTab.CopyItem"
                                           Image32by32="/_layouts/images/CATLG.gif"
                                           Command="CopyItem"
                                           Description="Copy Document"
                                           LabelText="Copy Document"
                                           Sequence="3"
                                           TemplateAlias="o1"/>
        </CommandUIDefinition>

2.定义Action功能

CA(CustomAction)的功能由CommandUIHandler中的CommandAction属性来定义。

CommandAction="javascript:
                        function CopyItem() {  
                        var items = SP.ListOperation.Selection.getSelectedItems();
                              if (items.length == 0) return;
                              var id;
                              for (var i in items) {
                                  id = items[i].id;
                                  break;
                              } //获取选中Item的Id
            var listId = SP.ListOperation.Selection.getSelectedList();
            //Get current web
            var myWeb = myContext.get_web();
            //Get list
            var myList = myWeb.get_lists().getById(listId);
            //Get Item
            var curItem = myList.getItemById(id); //获取选中的Item
            var contentType = curItem.get_contentType();
            var fields = contentType.get_fields();
            myContext.load(curItem);
            myContext.load(fields);
            myContext.executeQueryAsync
            (
                function () {
                    var newItem = myList.addItem(new SP.ListItemCreationInformation()); //通过COM 创建一条Item
                    var fieldEnumerator = fields.getEnumerator();
                    var myDate=new Date();
                    while (fieldEnumerator.moveNext()) { //开始赋值
                        var field = fieldEnumerator.get_current();
                        if (field.get_readOnlyField()) continue;
                        var name = field.get_internalName();
                        if (name == 'ContentType') name = 'ContentTypeId';
                        var value = curItem.get_item(name);
                        newItem.set_item(name, value);
                    }
                    newItem.update();
                    myContext.load(newItem);
                    myContext.executeQueryAsync(
                    function () {
                        alert('New document has been created.'); // NewItem赋值完毕
			var id = newItem.get_id(); //获取刚创建的 Item Id
                        OpenSubMenuDialog('/Lists/Test/EditForm.aspx?ID='+id+'&ContentTypeId=0x01003b7743e4960c4618865f01f122aeb900');//打开刚才赋值的Item
						//因为Item已经创建完毕,所以是跳转到EditForm而不是NewForm
                    },
                    function () { alert('CopyItem() failed:' + args.get_message()); });
                },
                function () {
                    alert('CopyItem() failed:' + args.get_message());
                });
            }
            CopyItem();"

3.根据上下文来控制CustomAction(必须只选中一条记录,才可用)

EnabledScript="javascript:
                                                                function enableDelegates()
                                                                {
                                                                    var items = SP.ListOperation.Selection.getSelectedItems();
                                                                    var viewName = getcurrurlFileName();
                                                                    if (items.length != 1)
                                                                       return false;
                                                                    else
                                                                        return true;
                                                                }
                                                                enableDelegates();"


至此CopyListItem核心功能开发完毕,如果想进一步的拓展,比如结合权限控制,只有相应权限的用户/组才能用,可以自行扩展。

思路很简单,在EnabledScript中,加一个条件来判断权限的.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值