Summary

This text assumes that the reader is at least vaguely familiar with the ins and outs of how to customise a WSS site definition, HTML, XML and CAML.
Please be aware that at the time of writing this I am still only a novice in the realm of Sharepoint development and therefore some of my "facts" may be inaccurate or just plain wrong. I welcome any corrections and will gladly acknowledge anyone who helps me progress with customising the Meeting workspace.


Creating the MPS Site Definition

Having been working on customising a Windows Sharepoint Services site for nearly 6 months now I have got to the stage where I need to customise the Meeting Workspace. I proceeded as normal (make a copy of the definition folders, name them accordingly and then create and modify the appropriate WEBTEMP*.xml files - here is a more detailed explanation from Microsoft about how to do this) and customised my lists and aspx pages, reset IIS and created a new Meeting workspace based on my new definition.


Oh Sharepoint!

Even at first glance I could see everything was indeed not fine. What Microsoft do not mention in their article here, here or even in the SDK is that the MPS definition can not be copied and modifed as per creating, for example, a new STS definition. This is due to the fact that some of the webparts (i.e. the Meetings list (Type="200"), and maybe some other bits and pieces too) required to make a Meeting workspace function correctly have the MPS definition ID hard-coded in them. If any of you care it is 2 and can be seen in the WEBTEMP.xml file, just look for this line: <Template Name="MPS" ID="2">.

At this point I went out for a coffee and smoke to sulk. All that effort that I had put in to styling and customising my Meeting workspace had been wasted and I would have to report to my boss that what his client wanted was not possible (indeed I might still have to if my work-around doesn't work).


The work-around

Not very long ago when I was creating my custom STS definition I found (read in the SDK) that you can have Sharepoint use any number of files of your choosing in the creation of a site, and also have Sharepoint call them what you want in whatever folder structure you want simply by referencing them in your definition's ONET.xml file in <Configuration> and <Module> elements.

By doing this I have been able to create a Meeting workspace that retains the all important ID of 2, uses my own default.aspx and other lists, etc. yet does not alter the original MPS definitions. However this is not fool proof. Because I have modified the original MPS ONET.xml my changes could be over-written with future upgrades and service packs for Sharepoint so I have back-ups of the working files and folders. It is for this reason that it is only a work-around.

Near the bottom of the ONET.xml file are the <Configuration> and <Module> elements that can be used to specify other files at the time of site creation. The following code sample is what I have added to the MPS ONET.xml:

<Configuration ID="10013" Name="Product Sourcing Meeting Workspace">
  <Lists>
    <List Title="Meeting Series" Type="200"></List>
    <List Title="Attendees" Type="202001"></List>
    <List Title="Agenda / Minutes" Type="101001"></List>
    <List Title="Objectives" Type="207001"></List>
    <List Title="Document Library" Type="101002"></List>
    <List Title="Tasks" Type="107001"></List>
    <List Title="Site Template Gallery" Type="111" Url="_catalogs/wt" RootWebOnly="TRUE"></List>
    <List Title="Web Part Gallery" Type="113" Url="_catalogs/wp" RootWebOnly="TRUE"></List>
    <List Title="List Template Gallery" Type="114" Url="_catalogs/lt" RootWebOnly="TRUE"></List>
  </Lists>
  <Modules>
    <Module Name="ProductSourcingMWS"/>
    <Module Name="WebPartPopulation"/>
  </Modules>
</Configuration>


As you can see I have followed the recommendation of giving the configuration a unique ID greater than 10,000 and I have named it according to the project specifications. The <List> elements all refer to lists that have been defined in the <ListTemplates> at the top of the file. It is there and in the Modules section that other files and paths are specified.

The <Module> element that uses my own default.aspx file is the one named ProductSourcingMWS and is shown below:

<Module Name="ProductSourcingMWS" Url="" Path="prdsrcmws">
  <File Url="default.aspx" NavBarHome="True">
    <View List="200" BaseViewID="0" WebPartZoneID="MeetingSummary"/>
    <View List="200" BaseViewID="2" WebPartZoneID="MeetingNavigator"/>
    <View List="207001" BaseViewID="0" WebPartZoneID="Left" WebPartOrder="1" />
    <View List="101001" BaseViewID="0" WebPartZoneID="Left" WebPartOrder="2" />
    <View List="202001" BaseViewID="0" WebPartZoneID="Left" WebPartOrder="3" />
    <View List="101002" BaseViewID="0" WebPartZoneID="Center" WebPartOrder="1" />
    <View List="107001" BaseViewID="0" WebPartZoneID="Center" WebPartOrder="2" />
    <NavBarPage Name="Home" ID="0" Position="Start"> </NavBarPage>
  </File>
</Module>


It is the Path attribute that specifes the physical location, relative to the folder that holds the current ONET.xml, of the file you want to use. In this case the default.aspx file is in a folder named prdsrcmws within the existing MPS folder. I did not reference my own Meetings list (List="200") as this did not need altering but the rest did. IIS reset, create a new Meeting workspace based on this definition and everything appears to be in working order.


Appearances are deceiving

With my new and apparently improved Meeting workspace created (maintaining the template ID of 2 and therefore showing under the Meeting Workspaces section of mngsubwebs.aspx) I checked that my own list definitions had properly been implemented. My custom lists are the ones with the 6 digit IDs. All were working correctly until I created a Meeting Request from within Outlook and linked it to my new Meeting workspace. The Attendees list should automaitcally be populated with the Outlook Invitees when the email is sent. This does not happen. After much playing around with the SCHEMA.xml file of my custom Attendees list I began to suspect that this was going to be another part of the MPS definition that can not be customised in the usual manner. By adding the original Attendees list (List="202") to my definition and creating another Meeting workspace and linking to it via Outlook I quickly proved this. As with the MPS requiring an ID of 2, it appears that the Attendees list requires an ID of 202 in order for it to function as expected.


What now?

What I am working on now (May 2006) is based on Todd Bleeker's Subwebs On The Quick Launch Web Part (one that I am using in this current project - after a bit of tweaking) where the data is loaded into an invisible <IFRAME> and then extracted with javascript before being dumped in the Quick Launch (or any place of your choosing). I plan to load the original Attendees list into the hidden <IFRAME>, attack it with javascript and attempt to populate my own (visible) Attendees list. However I do suspect that I will have to write some C# unless I can find a way of adding items to lists using javascript.


Data concurrency issues

Alright so the javascript method was a bit rubbish. I ended up writing a whole load (not much actually) of C# to transfer the intial data from the original MPS Attendees list to my custom list. However I soon ran into some data concurrency problems between the two lists. Having not written any code to deal with such issues I am a bit lost. If there is a (free) web part that will synchronise two lists that are from different base types please let me know.

In the mean time I have been playing with custom view definitions in the SCHEMA.xml of the original MPS definition that will reference my own files. Defining the view was simple enough - a quick copy paste of an existing one and assigning it a new ID number - however when I tell ONET.xml to use this view as the default the Attendee list view web part does not load. Maybe I missed something in the definition? I don't know just yet but with a bit more time spent experimenting with things hopefully I will get this sorted out.

I have now fixed the concurrency issue. In the same C# code that transfers the initial attendees to my custom list I empty the original. This is not a problem since the attendees are managed from within the Meeting Workspace.