SharePoint 2013 中开发可以被标记为未读和已读的列表之思路篇

本文介绍SharePoint 2013中开发可以被标记为未读和已读的列表的思路。 

1.      首先笔者考虑到每个UserReadMark 信息是独立的,需要有一张列表了记录那些User读过某条记录,列表命名为ReadList,使用列表名称+ Item ID + User ID作为Read Mark的组成部分。当用户View这个Item 时通过API取得列表名称,ItemID User ID拼接成Read Mark插入ReadList 中。 

2.      接着问题是如何知道用户什么时候ViewItem?我们知道Item Update, Create, Delete都是有Event Handler的,但是View是没有的,这里就要用到一个辅助字段Readed该字段使用客户化的Filed TypeSharePoint 2013中是可以客户化字段类型(Custom Filed Type)http://msdn.microsoft.com/en-us/library/jj220061.aspxSharePoint 2010 其实也是可以的,  SharePoint 2013 强大的地方就是它可以使用JSLinkUrl 所指向的JS客户化Filed Type的显示模版

 

(function () {
    var ReadMarkContext = {};

    // you can provide templates for:
    // View, DisplayForm, EditForm and NewForm
    ReadMarkContext.Templates = {};
    ReadMarkContext.Templates.Fields = {
        "ReadMarkField": {
            "View": ReadMarkViewTemplate,
            "DisplayForm": RenderDisplayFormForReadMark
        }
    };

    SPClientTemplates.TemplateManager.RegisterTemplateOverrides(
        ReadMarkContext
        );
})();

……….


这里我们只客户化该字段在DisplayForm中和在List View显示的模版,在JavaScript 函数中我们就可以RenderDisplayFormForReadMarkReadList中插入Read Mark

 

3.      解决插入问题后就要考虑List View如何判断哪个Item是否已读了,同样我们需要借助辅助字段 Readed,在ReadMarkViewTemplate函数中返回类似占位符的标记,如 

return"<spanclass='ReadMarkFiledPlaceHloderClass' id='" + readMarkId + "' >dataloading</span>";


然后要用到的就是客户化List View了:http://msdn.microsoft.com/en-us/library/jj220045.aspx主要利用SharePoint 2013 可以使用JSLinkUrl  所指向的JS客户化List View的显示模版的特性: 

var overrideCtx = {};
 overrideCtx.Templates = {};
 overrideCtx.OnPostRender = postRenderHandler;
 SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideCtx);

 

其实这个Template有很多属性可以覆盖和重写,我们这里主要使用OnPostRender就是当着个List View render 完成后会调用这个方法。(其他未覆盖属性SharePoint会使用默认模版中的值 clienttemplates.js)。

接下来我们在postRenderHandler函数中先找到我们先前留下的占位符

readMarkPlaceHolders = $(".ReadMarkFiledPlaceHloderClass");

然后遍历所有占位符,取得其id(readMarkId) ,拼接成CAML    

  var values ='';
     readMarkPlaceHolders.each(function () {
        values += " <Value Type = \'Text\'>" + $(this)[0].id + " </Value>"
    });

    return '<View><Query><Where><In><FieldRef Name=\'Title\'/>' +
        '<Values>' + values +
        '</Values></In></Where></Query>' +
        '<RowLimit>200</RowLimit></View>';
}

ReadList中去查询,遍历返回结果,我们在上面插入的Read Mark,所有返回的Read Mark和占位符的ID匹配上的表示该Item已经被当前用户读过了,将其余没匹配上的标记为Bold(加粗显示)且内容改为UnRead, 匹配上的内容改为Read

 

4.      接下来是如何让User可以使用RibbonbuttonContext Menu将已读的Item标记为未读,相信过SharePoint都知道要用Custom action

a.      添加内容菜单  

CustomAction
      Id="65695319-4784-478e-8dcd-4e541cb1d682.CustomAction"
      RegistrationType="List"
      RegistrationId="10057"
      Location="EditControlBlock"
      Sequence="10001"
      Title="UnRead">
    <!-- 
    Update the Url below to the page you want the custom action to use.
    Start the URL with the token ~remoteAppUrl if the page is in the
    associated web project, use ~appWebUrl if page is in the app project.
    -->
    <UrlAction Url="javascript:ClickUnReadContextMenu();" />

b.     添加Ribbon button

  

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <!-- Adds a Ribbon custom action to a list in the host web site. -->
  <!-- Create a new custom list and add a new item to it -->
  <!-- RegistrationId attribute is the list type id,
        in this case, a read mark list (id=10057). -->
  <CustomAction Id="75dd24d9-0c16-4ef5-be0a-f52ed0e620fa.CustomAction"
              RegistrationType="List"
              RegistrationId="10057"
              Location="CommandUI.Ribbon"
              Sequence="10001"
              Title="UnReadRibbon">
    <CommandUIExtension>
      <CommandUIDefinitions>
        <CommandUIDefinition Location="Ribbon.ListItem.Manage.Controls._children">
          <Button
              Id="Ribbon.Library.Connect.PropertyViewer"
              Alt="Invoke custom action"
              Sequence="115"
              Command="Invoke_CustomAction"
              LabelText="UnReadRibbon"
              TemplateAlias="o1"
              Image32by32="_layouts/15/images/placeholder32x32.png"
              Image16by16="_layouts/15/images/placeholder16x16.png" />
        </CommandUIDefinition>
      </CommandUIDefinitions>
      <CommandUIHandlers>
        <CommandUIHandler
            Command="Invoke_CustomAction"
            CommandAction="javascript:ClickUnReadRibbonButton()"
            EnabledScript ="javascript:EnableUnRead()"/>           
      </CommandUIHandlers>
    </CommandUIExtension>
  </CustomAction>
  <CustomAction
    Id="Ribbon.ListItem.Manage.ReadMarkAction"
    Location="ScriptLink"
    ScriptSrc ="~site/_layouts/15/ReadMark/ReadMarkAction.js"/>

</Elements>

最后还是要用JavaScript当家,需要写JavaScript函数ClickUnReadContextMenu, ClickUnReadRibbonButtonEnableUnRead来处理这些事件,可以先用下列代码取得当前选中的数据,然后找到对应的Read Mark, 调用JavaScript OM来从ReadList中删除这些Read Mark,使用JS将对应的Item的字体改为Bold:

var ctx = SP.ClientContext.get_current();
var items = SP.ListOperation.Selection.getSelectedItems(ctx);

整个思路介绍到这里了,代码我会在随后的文章中分享给大家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SharePoint 2013的部署可以通过在线安装或离线安装来完成。在线安装是推荐的方法,因为离线安装相对繁琐。然而,如果出于安全考虑不准备连接互联网,也可以在安装SharePoint时临时连接。在局域网环境下,可以完成后续的SQL Server安装和SharePoint配置操作。\[2\] 在部署SharePoint 2013之前,需要注意一些限制。首先,SharePoint 2013不支持安装到生产环境的域控制器上。此外,不支持单标签域 (SLD) 名称或单标签林。在单标签域环境实现SharePoint 2013时,可能会出现不兼容问题。因此,在部署之前需要确保满足这些要求。\[1\] 在进行部署时,需要将下载的安装文件复制到SharePoint的安装目录下,创建一个安装文件夹。SharePoint 2013默认会将安装文件解压到c:\program Files(X86)\MSECache\SharePoint2010下。\[3\] 总之,部署SharePoint 2013可以选择在线安装或离线安装。在线安装更为简洁方便,但如果需要离线安装,可以在局域网环境下完成后续的操作。在部署之前需要注意一些限制,如不支持安装到域控制器上和单标签域环境可能会出现不兼容问题。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [部署SharePoint2013](https://blog.csdn.net/weixin_34185364/article/details/85115073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值