Sunday, February 12, 2006

Free SharePoint Portal Server Web Part: Events for You


The Events for You Web Part functions in a manner very similar to the Links for You Web Part that can be found on the Home Page and Personal MySite page of SharePoint Portal Server. With this free Web Part, Event Items from the Events List located in the portal’s root web are presented to portal users based on their Audience membership. The Events for You Web Part can also be configured to override a user’s Audience membership, targeting Events to a definable set of one or more Audiences. In order to function properly, the Events for You Web Part requires that the Events List located in the portal’s root web be customized with the addition of an “Single line of text” type column named Audience. The Audience column can contain a semicolon delimitted list of Audiences for targeting that particular Event Item. The Events for You Web Part also requires that the Events List has the “Current Events” view.

Here’s a screenshot of Events For You in action:

E4U ShowOff

Setup Instructions

Follow these steps to setup your portal’s Events List for use with the Events for You Web Part:

Modify Events ListModify Settings and ColumnsAdd new column
1. Modify Events List2. Modify Settings and Columns3. Add a New Column
Single Line of Text Type ColumnPopulate Audience Column Values
4. Single Line of Text Column Type5. Poplulate Audience Values

Customizing Behavior

Once you have the Events list setup and populated with data, you can customize how the Events for You Web Part behaves:

Modify Shared Web PartDeselect 'Use default user audiences'Target Specific Audiences
1. Modify Shared Web Part2. Deselect ‘Use default user audiences’3. Target Specific Audiences

Technical Perspective: A few highlights

The Events for You Web Part makes use of the SPQuery object and CAML to query the Events list.

SPQuery query = null;
string caml = string.Empty;
SPListItemCollection results = null;

// CAML uses ISO8601 date format: yyyy-mm-ddThh:mm:ssZ
string todaysDate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Today).ToString();

try
{
query = new SPQuery(events.Views["Current Events"]);

// Build the CAML Query to get all Events which belong to the current Audience (a)
// and have start date of today or in the future
// Apparently there is a problem with using CAML to get recurring events, so they're not supported.
// More info about DateRangesOverlap element at
http://wss.collutions.com/Lists/FAQ/DispForm.aspx?ID=320
caml = string.Format("<Where><And><Contains><FieldRef Name='Audience'/><Value Type='Text'>{0}</Value></Contains>"
+ "<And><Geq><FieldRef Name='EventDate' /><Value Type='DateTime'>{1}</Value></Geq><DateRangesOverlap>"
+ "<FieldRef Name='EventDate'></FieldRef><FieldRef Name='EndDate'></FieldRef><FieldRef Name='RecurrenceID'>"
+ "</FieldRef><Value Type='DateTime'><Month/></Value></DateRangesOverlap></And></And></Where><OrderBy><FieldRef Name='EventDate'/></OrderBy>",

audienceName, todaysDate);
query.Query = caml;
results = events.GetItems(query);

// If the results collection contains items, we have some hits
if(results.Count > 0)
hasEvents = true;
}
catch(ArgumentException ex)
{
// 'Current Events' View doesn't exist
_messages.Text += "<p>This portal's 'Events' List must have a 'Current Events' View defined in order for this web part to function properly.</p>";
_hasHandledErrors = true;
break;
}
catch(NullReferenceException ex)
{
// No items in results collection
_hasHandledErrors = true;
break;
}
catch(Microsoft.SharePoint.SPException ex)
{
// 'Audiences' column not defined
_messages.Text += "<p>This portal's 'Events' List must have a 'Single line of text' type Column named 'Audience' defined in order for this web part to function properly.</p>";
_hasHandledErrors = true;
break;
}

The AudienceManager object is used to determine Audiences for the current user:

// Returns an array of audience names for the current portal user
public static string[] GetUserAudiencesNamesArray(string url)
{
// Get the portal context
SPSite portal = new SPSite(url);
PortalContext context = PortalApplication.GetContext(portal.ID);

// Get the list of audiences for the user
AudienceManager manager = new AudienceManager(context);
string[] names = new string[manager.GetUserAudienceIDs().Count];
IEnumerator enumer = manager.GetUserAudienceIDs().GetEnumerator();
int i = 0;
while(enumer.MoveNext())
{
AudienceNameID temp = (AudienceNameID)enumer.Current;
names[i] = temp.AudienceName;
i++;
}
return names;
}

The MSOPGrid_doBuilder() JavaScript function located in ows.js is used to launched the Audience Chooser Custom Property Builder:

private void RegisterJavaScripts()
{
try
{
// Client-side code to apply changes
string applyFunction = "ApplyProperties" + _qualifier;
string EmbeddedScriptFormat = "<script language=jscript>function " + applyFunction + "(){\n";
EmbeddedScriptFormat += "document.forms[MSOWebPartPageFormName].MSOTlPn_Button.value = 'apply';\n";
EmbeddedScriptFormat += "document.forms[MSOWebPartPageFormName].elements['" + _shortId + ":MSOTlPn_AppBtn'].click();\n";
EmbeddedScriptFormat += "}\n";
EmbeddedScriptFormat += "</script>\n";
if(!Page.IsClientScriptBlockRegistered(applyFunction))
Page.RegisterClientScriptBlock(applyFunction, EmbeddedScriptFormat);
// Client-side button click handler
string onClick = "MSOPGrid_doBuilder('"
+ "_layouts/1033/Audience_Chooser.aspx" + "', " + "EventsForYou" + _qualifier
+ ", '" + "dialogHeight:510px;dialogWidth:560px;help:no;status:no;resizable:yes" + "');";
onClick += applyFunction + "();";
_button.Attributes.Add("OnClick", onClick);
// Client-side checkbox click handler
_chkDefaults.Attributes.Add("OnClick", applyFunction + "()");
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(string.Format("{0} {1} {2}",ex.GetType().ToString(), ex.Message, ex.StackTrace), "ERROR");
}
}

The source code and binaries for the Events for You Web Parts are released to public domain. Download source and binaries from the links below.

EventsForYou-1.0.0.0.zip

EventsForYou-1.0.0.0–Source.zip

8 comments:

Erol GIRAUDY said...

Thanks on my blog EROL

Erol GIRAUDY said...
This comment has been removed by a blog administrator.
Anonymous said...

Very helpful thankyou

Anonymous said...

Hi,

I have a problem using "events for you".

I have downloaded version 1.0.0.0, unzipped it on my sharepoint server computer and run installation (logged in as administrator). In command window that is opened, I got a message that installation succeeded.

I went to my portal and followed your instructions about adding Audience text field.

I also created new audience and compiled it and populated Audience column in all my events with this new audience.

After that I tried to add new portal part to my portal page and to "My Site" page and in both cases I get the same error:

System.Security.SecurityException Request for the permission of type Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c failed.

This portal must have an 'Events' List defined in order for this web part to function properly.

No events.


On my portal home page I do have Events (that are managed as top-level list) and I added the Audience to THIS list as instructed.

What could cause my problem?

Anonymous said...

Hi,

I have a problem using "events for you".

I have downloaded version 1.0.0.0, unzipped it on my sharepoint server computer and run installation (logged in as administrator). In command window that is opened, I got a message that installation succeeded.

I went to my portal and followed your instructions about adding Audience text field.

I also created new audience and compiled it and populated Audience column in all my events with this new audience.

After that I tried to add new portal part to my portal page and to "My Site" page and in both cases I get the same error:

System.Security.SecurityException Request for the permission of type Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c failed.

This portal must have an 'Events' List defined in order for this web part to function properly.

No events.


On my portal home page I do have Events (that are managed as top-level list) and I added the Audience to THIS list as instructed.

What could cause my problem?

Unknown said...

anonymous poster,

To get around the security excpetion you are seeing, you'll need to open your web.config file and change the trust level from WSS_Minimal to WSS_Medium.

Anonymous said...

Great!

It works. Thank you for this useful webpart.

Anonymous said...

Hi,

I'm trying to enable the events web part but it doesn't seem to look the same as your screen shots. The details are fine but the headings (that are showing in orange on your screen shots)don't appear to be the same. Please can you help