Sharepoint2010-CustomAction之CopyListItem

来源:互联网 发布:淘宝王子什么联系的 编辑:程序博客网 时间:2024/06/05 12:14

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中,加一个条件来判断权限的.



原创粉丝点击