SharePoint Calendar Helper 发布喽

在SharePoint中和Calendar打交道其实并不愉快,尤其是要处理会重复发生的事件时,还得处理一段XML。我特别不喜欢这种编程方式,所以就有了SharePoint Calendar Helper。
SharePoint Calendar Helper的主要目的就是简化对Calendar的读取和写入操作,你不需要了解Event包含的那些Field的Id或Internal Name是什么,更不需要了解RecurrenceData是什么格式以及如何编写。

空口无凭,让我们来做个比对。
假设我们要读取一个超级简单的Event的某些信息,用SharePoint的原生方式,我们可能会写出这样的代码(如何查询得到SPListem的步骤不计,这也不是SharePoint Calendar Helper的目的所在):


var location = item[SPBuiltInFieldId.Location] as string;
var start = (DateTime)item[SPBuiltInFieldId.StartDate];
var end = (DateTime)item[SPBuiltInFieldId.EndDate];
var description = item[SPBuiltInFieldId.Comments] as string;
//注意,不知道产品团队怎么想的,但Event的Description字段确实是用SPBuiltInFieldId.Comments来表示的,而不是SPBuiltInFieldId.Description

再来看看使用SharePoint Calendar Helper的代码是怎样的:


using WindStyle.SPCalendar;

var regionalSettings = SPContext.Current.RegionalSettings;
var evt = Event.ParseEvent(item, regionalSettings);
var location = evt.Location;
var start = evt.Start;
var end = evt.End;
var description = evt.Description;

虽然使用SharePoint Calendar Helper需要额外提供一个SPRegioinalSettings对象(这是为了能够根据时区做一些时间转换),但还是能明显看出第二段代码是要简单许多,可读性也高出不少。

那么再来看看如何读取重复事件,试想有这样一个重复事件,它在每年的某个月的第三个星期五都会发生,重复若干次后结束,要怎样获取它的详细信息?
如果使用SharePoint的原生做法,你得去获取这个item的RecurrenceData,然后得到大概如下所示的XML:


<recurrence>
<rule>
<firstDayOfWeek>mo</firstDayOfWeek>
<repeat>
<yearlyByDay yearFrequency="1" fr="TRUE" weekdayOfMonth="third" month="6" />
</repeat>
<repeatInstances>10</repeatInstances>
</rule>
</recurrence>

分析吧,少年!我是懒得写出具体的代码了。
或者,试试SharePoint Calendar Helper:


var evt = Event.ParseEvent(item, regionalSettings) as Event<Pattern.YearlyByDayPattern>;
var month = evt.Recurrence.Pattern.Month;
var ordinal = evt.Recurrence.Pattern.Ordinal;
var days = evt.Recurrence.Pattern.Days;
var repeatInstance = evt.Recurrence.DateRange.End.Instances;

你可能已经注意到Event.ParseEvent的返回值可以被转换成具体的Event,但是该怎么转换呢?其实也很简单:


var evt = Event.ParseEvent(item, regionalSettings);
If(evt.EventType == EventType.YearlyByDay)
{
var realEvent = evt as Event<Pattern.YearlyByDayPattern>;
}

不仅如此,如果你拿到了一个重复事件,你也可以用该事件的Recurrence.DateRange.End.EndType来判断它会如何结束。

说了这么多,都是关于读取,那么如何更新一个Event呢?按照SharePoint的原生方式,你依然要和Fields打交道,依次赋值,如果是一个重复事件,你还得去拼一个RecurrenceData XML,用手指头都能想到有多麻烦
(你的手指头一定会想到这一点的,毕竟最后受苦的还是它自己)。
而使用SharePoint Calendar Helper,你只需要通过Event.ParseEvent得到一个Event对象(如果是创建事件的话,直接实例化一个适当的Event对象),然后修改它的属性,最后把它应用到SPListItem上面就行了:


var evt = new Event<Pattern.DailyByFrequencyPattern>();
evt.Title = "SharePoint Calendar Helper Demo";
evt.Recurrence.Pattern.Frequency = 2;

Event.ApplyEvent(evt, calendarItem, regionalSettings);
calendarItem.Update();

我仿佛已经听到了手指头在高呼“万岁”。

如果你想知道,像SharePoint Calendar Helper这么赞的东西要卖多少钱的话,下面要宣布的消息可能会让你大吃一惊:
它是免费的!
这还不够,它还是开源的!
赶紧点击下面的链接去下载SharePoint Calendar Helper吧!
https://spcalendar.codeplex.com/

发表评论

电子邮件地址不会被公开。 必填项已用*标注