For a non-profit parenting organization like PRAM, the calendar means everything. They have monthly board meetings, weekly playgroup schedules, classes, workshops, holiday parties, and other programs going on all the time. The Calendar List in SharePoint 2007 is the perfect solution since it allows for both one-time and recurring events, just like Outlook. However, meetings, playgroups, and programs each have different attributes (or columns). For example, playgroups need to track the playgroup leader and the leader's contact information, while classes need to track information about the teacher, fees, and discounts, none of which is provided by default in the list.
So, how can I set up my calendar lists to support multiple types of events? I could add a superset of columns to the default list, but then I would have to think about the non-applicable columns every time I added/edited an event. Alternatively, I could create a different list for each type of event, but then users would have to check each calendar to make sure they weren't double-booking a location, or scheduling two important events at the same time.
The obvious answer is to use a single calendar list, and use the built-in content type functionality in SharePoint 2007, which allows you to support multiple types in a list. I could go on forever about it, but you can read more about content types here. In PRAM, here's what all this looks like:
This is exactly what we want, three different content types in one calendar: Event, Playgroup, and Program. Users can store all of their data in one calendar and just add different views for different visualizations of the data. For example, I added an All Programs view that has a filter on the Program content type.
But wait, there's a catch! Although content types are supported in calendar lists, in order to be useful, they should inherit the built-in Event content type. This allows them to support recurrence and other nice features of events. Unfortunately, SharePoint hides the Event content type in a special content type group named "_Hidden". As you might have correctly guessed, you can't inherit from hidden content types because you can't see/access them via the SharePoint interface by default.
To get around this limitation, follow these steps:
Make a backup of this folder: [Drive]:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\ctypes\
In the ctypeswss.xml file, find the section beginning with stsadm -o deactivatefeature -filename "ctypes\feature.xml" -url http://[Application][Drive]:\>stsadm -o activatefeature -filename "ctypes\feature.xml" -url http://[Application]
This un-hides the Event content type and places it in the List Content Types group under your Site Content Type Gallery. Now you are free to use the Event content type as a parent for your new content types! Once you are done, you can re-hide the Event content type by replacing the ctypes folder with the backup from Step 1, or by following the above steps again, but swapping the two groups in Step 3. Good luck!