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

原创 2013年01月24日 20:50:42

本文介绍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);

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

javamail定时读取邮箱的未读邮件(imap)

为啥不用pop3而用imap,是因为imap能把邮件设置为已读,而pop3不能; 使用javamail mail.imap读取邮箱的邮件,综合网上的例子,贴出自己实际使用的代码供大家参考: 步...
  • zoufaxiang
  • zoufaxiang
  • 2016年03月10日 16:39
  • 7285

JavaMail通过IMAP和POP3接收未读以及设置已读邮件

[html] view plaincopy javamailpop3imap   使用javaMail收邮件主要有两种协议,一种是pop3,一种是imap。这两种协议都可以用来收邮件,但...
  • kent_kent_kent
  • kent_kent_kent
  • 2013年11月14日 18:57
  • 8212

All About JAVA javamail的pop3以及IMAP方式读取未读邮件等操作

/** * 可以在props下设置认证信息,协议和端口信息,超时等信息,这样在store.connect的时候可以根 * 据props里是否设置了认证信息来选择不带参数的connect()或者如下...
  • arvinrong
  • arvinrong
  • 2015年05月16日 12:54
  • 4556

【转自loveifa】PHP 获取邮箱未读邮件的方法 根据receivemail改编而来,已解决乱码,编码问题

receivemail是老外写的,难免不支持中文,研究了一个下午终于成功解决了这个问题,写出来给大家分享下   [php] view plaincopy ...
  • sinat_25419171
  • sinat_25419171
  • 2015年02月07日 09:13
  • 1042

SharePoint 快速配置系统默认控件: "任务"的邮件通知

SharePoint 快速配置系统默认控件的邮件通知 SharePoint 系统自动Webpart“任务” 有很多有用的小功能,如一一下列出。 添加Webpart 或App 添加内容 ...
  • jason_dct
  • jason_dct
  • 2016年09月22日 19:55
  • 1131

jmail收取未读邮件(带附件)

/** jmail 收取"未读邮件" **/ //测试邮箱地址为 recieveceshi@163.com   /* pop.DownloadUnreadMessages()是用来“收取未读邮件...
  • aAa9079
  • aAa9079
  • 2014年08月27日 18:09
  • 1439

关于类似Gmail邮件撤销功能实现初探

谷歌日前在旗下电子邮件服务Gmail中添加了一个“反悔(Undo)”功能,允许用户取消已发送的邮件。其实,邮件延迟本来是Gmail的一个缺陷,谷歌的邮件系统较其他邮件系统要慢得多,通常都需要一段时间才...
  • ly51212
  • ly51212
  • 2015年06月24日 19:42
  • 704

为 SharePoint 2013 服务器场配置传出电子邮件

为 SharePoint 2013 服务器场配置传出电子邮件 此文为转载: 参考地址:https://technet.microsoft.com/zh-cn/library/cc263462.aspx...
  • jason_dct
  • jason_dct
  • 2016年07月07日 15:28
  • 2049

利用SharePoint designer发送包含图片的邮件

我们可以利用SharePoint Designer 2007或2010的工作流来发送包含具有样式文本的邮件。 具体的做法就是: 1、创建一个自定义列表 2、列表中定义几个栏位:Title,邮件标...
  • apensu
  • apensu
  • 2013年05月28日 17:29
  • 1655

JavaMail通过IMAP和POP3接收未读以及设置已读邮件

javamailpop3imap 使用javaMail收邮件主要有两种协议,一种是pop3,一种是imap。这两种协议都可以用来收邮件,但是在其中的处理上是有区别的。pop3是不支持判断邮件是否为已读...
  • u011382076
  • u011382076
  • 2013年10月16日 17:10
  • 2728
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SharePoint 2013 中开发可以被标记为未读和已读的列表之思路篇
举报原因:
原因补充:

(最多只允许输入30个字)