SharePoint

Projectsite – De basis

25 maart 2013

In veel projecten waarbij ik betrokken ben als developer wil de klant een omgeving waarin samengewerkt kan worden. Vaak wordt dit onder de noemer ‘Projectsites’ of ‘Samenwerkingssites’ geschaard. Om efficiënt op te kunnen schalen zorgen wij ervoor dat iedere projectsite een sitecollectie is. Om de projectsites allemaal een gelijke basis te geven en upgradable te maken, wordt er in veel van onze projecten gekozen om alles in een SharePoint Solution te verpakken. In deze blog-serie wil ik laten zien waar wij mee te maken krijgen en hoe wij dingen aanpakken.

Het eerste deel van mijn blog gaat over het opzetten van de basisstructuur van een projectsite en met name hoe het er uit ziet in Visual Studio. Omdat we bij projecten specifieke informatie willen opslaan beginnen we met het aanmaken van kolommen en inhoudstypes. In dit voorbeeld bevat een project een kolom ‘projectstatus’. Deze projectinformatie gaan we opslaan in de welkomstpagina van het project. Het inhoudstype waar waarvan overerft wordt is ook welkomstpagina.

[xml]
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Field ID="{1724ccb8-e257-4e23-ac14-66b76a122b66}"
Name="Projectstatus"
Type="Choice"
Format="Dropdown"
DisplayName="Projectstatus"
Group="SPCNL">
<CHOICES>
<CHOICE>Pipeline</CHOICE>
<CHOICE>Huidig</CHOICE>
<CHOICE>Gesloten</CHOICE>
</CHOICES>
</Field>
</Elements>
[/xml]

Deze kolom wordt gebruikt op het inhoudstype ‘Projectwelkomstpagina’

[xml]
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<!– Parent ContentType: Welcome Page (0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390064DEA0F50FC8C147B0B6EA0636C4A7D4) –>
<ContentType ID="0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390064DEA0F50FC8C147B0B6EA0636C4A7D400690767DAABA5451E87A4698AC7090D23"
Name="Projectwelkomstpagina"
Description=""
Group="SPCNL"
Inherits="TRUE"
Version="0">
<FieldRefs>
<FieldRef ID="{1724ccb8-e257-4e23-ac14-66b76a122b66}" Name="Projectstatus" Format="Dropdown" />
</FieldRefs>
</ContentType>
</Elements>
[/xml]

Het inhoudstype wordt gekoppeld aan een nieuwe pagina-indeling. Deze pagina-indeling word geprovisioned via de module ModPageLayouts.

[xml]
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Name="ModPageLayouts" Url="_catalogs/masterpage" RootWebOnly="TRUE" Path="">
<File Path="ModPageLayouts\ProjectwelkomstpaginaIndeling.aspx" Url="ProjectwelkomstpaginaIndeling.aspx" Type="GhostableInLibrary">
<Property Name="Title" Value="ProjectwelkomstpaginaIndeling" />
<Property Name="PublishingAssociatedContentType" Value=";#Projectwelkomstpagina;#0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390064DEA0F50FC8C147B0B6EA0636C4A7D400690767DAABA5451E87A4698AC7090D23;#"/>
</File>
</Module>
</Elements>
[/xml]

Hier vind je de pagelayout die wordt gebruikt. De pagelayout is een versimpelde versie van WelcomeSplash, met als toevoeging het projectstatus veld. Alle drie de elementen zitten in een site-scoped feature ‘SPCNL.Projecten – Infrastructuur voor projectensites’. Om deze elementen op de juiste manier te kunnen gebruiken moeten er nog twee dingen gebeuren. Het inhoudstype moet in de paginabibliotheek beschikbaar zijn op een projectsite en er moet een welkomstpagina gemaakt worden die de nieuwe ‘ProjectwelkomstpaginaIndeling’ gebruikt.

Het beschikbaar maken van een inhoudstype in een lijst gebeurt door middel van content type binding waarbij de lijst en het inhoudstype ID worden meegegeven.

[xml]
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<ContentTypeBinding ContentTypeId="0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390064DEA0F50FC8C147B0B6EA0636C4A7D400690767DAABA5451E87A4698AC7090D23"
ListUrl="$Resources:osrvcore,List_Pages_UrlName;"
RootWebOnly="FALSE" />
</Elements>
[/xml]

De pagina wordt geplaatst door een module. In de module zitten twee bestanden: een default.aspx en een Elements.xml. De default.aspx bevat dezelfde inhoud als de default.aspx van een publishing portal. Deze is te vinden in …15\TEMPLATE\SiteTemplates\PUBLISHING\

[xml]
<%@ Page Inherits="Microsoft.SharePoint.Publishing.TemplateRedirectionPage,Microsoft.SharePoint.Publishing,Version=15.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" %>
<%@ Reference VirtualPath="~TemplatePageUrl" %>
<%@ Reference VirtualPath="~masterurl/custom.master" %>
[/xml]

In de module wordt behalve de titel ook het inhoudstype en de pagina-indeling opgegeven.

[xml]
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Name="ModProjectwelkomstpagina" Url="$Resources:osrvcore,List_Pages_UrlName;" Path="">
<File Path="ModProjectwelkomstpagina\default.aspx" Url="default.aspx" Type="GhostableInLibrary">
<Property Name="Title" Value="Welkom op de projectsite" />
<Property Name="ContentType" Value="Projectwelkomstpagina" />
<Property Name="PublishingPageLayout" Value="~SiteCollection/_catalogs/masterpage/ProjectwelkomstpaginaIndeling.aspx, ProjectwelkomstpaginaIndeling" />
</File>
</Module>
</Elements>
[/xml]

Deze twee elementen; de content type binding en de welkomstpagina module, zitten in een web-scoped feature ‘SPCNL.Projecten – Projectsite’.

Om uiteindelijk in de interface een sitecollectie aan te kunnen maken van het type ‘projectsite’ is een webtemplate nodig. Webtemplates zijn sinds SharePoint 2010 de nieuwe manier om sites aan te kunnen maken op basis van een sjabloon. Als je meer wilt lezen over webtemplates dan raad ik dit artikel van Vesa Juvonen aan.
http://blogs.msdn.com/b/vesku/archive/2010/10/14/sharepoint-2010-and-web-templates.aspx

Voor een webtemplate is een ‘empty element’ nodig.

[xml]
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<WebTemplate BaseConfigurationID="1"
BaseTemplateID="1"
BaseTemplateName="STS"
Description="Sjabloon voor het aanmaken van projectsites"
DisplayCategory="SPCNL"
Name="WTProject"
Title="Projectsite" />
</Elements>
[/xml]

Dit element bevat een ONET.xml bestand. Van dit bestand moet het DeploymentType op ElementFile gezet worden anders werkt het sjabloon niet. Voor de ONET.xml is de SharePoint projectsite als basis genomen en uitgebreidt met de SharePoint publicatie features en de twee nieuwe features die hierboven staan beschreven.
[listdot]

  • SPCNL.Projecten – Infrastructuur voor projectensites
  • SPCNL.Projecten – Projectsite

[/listdot]
Hier kun je zien hoe mijn onet eruit ziet.

Het webtemplate element zit in de farm-scoped feature ‘SPCNL.Projecten – Templates’. Het complete package ziet er nu zo uit:

ProjectSitesBasis1

Alles is nu gereed om te kunnen deployen. Als dat allemaal goed gaat kun je vanuit Central Administration een projectsite aanmaken op basis van het zelfgemaakte projectsite sjabloon.

ProjectSitesBasis2

Na het aanmaken van de projectsite hoeft een gebruiker alleen de pagina te bewerken om de projectgegevens in de pagina op te kunnen slaan en de pagina te kunnen publiceren.

ProjectSitesBasis3

Hiermee is de basis voor de projectsite gelegd.

You Might Also Like

7 reacties

  • avatar
    Reply marc 26 maart 2013 at 13:13

    Interessant. Hoe kan ik een overzicht maken van alle projectsites en hoe kan ik daar metadata zoals projectmanager aan koppelen? Ik heb al wel een ideetje maar ben benieuwd hoe jij dit oplost.

    gr,

    Marc

    • avatar
      Reply Melvin Vermeer 28 maart 2013 at 08:10

      Hoi Marc,

      Leuk dat je dit vraagt. Dit artikel heb ik ‘de basis’ genoemd, ik ben nu bezig met een artikel als vervolg op deze. In dat artikel leg ik uit hoe we op basis van het sjabloon uit dit artikel een overzicht van alle projecten kunnen gaan maken.

      Voor wat betreft het bijhouden van de projectmanager, je kunt natuurlijk zoveel velden koppelen aan de projectwelkomstpagina als nodig. Voor projectmanager zou je bijvoorbeeld een SharePoint Person field kunnen gebruiken.

      Groet,
      Melvin

      • avatar
        Reply marc 1 april 2013 at 19:00

        En top dat jij reageert:-)

        De welkomstpagina is de key tot een overzicht incl. metadata, dat is uiteindelijk ook mijn conclusie geweest toen ik een aantal jarene geleden met hetzelfde vraagstuk aan de gang ging.
        Je moet dan wel de scope in je pagina aanpassen naar site zodat je het content type over de hele site kan weergeven.

  • avatar
    Reply Martijn Juurlink 25 april 2013 at 16:02

    Melvin,
    Interessante blog maar wat ik eigenlijk mis is de inleiding waarom jullie gebruik maken van een sitecollectie per project en wat hierin de voor en nadelen zijn.
    Vanuit mijn oogpunt zie ik namelijk het grote nadeel dat men beheer en onderhoud per site collectie moet gaan doen i.p.v. op hoofdniveau. Tevens is een sitecollectie naar mijn idee pas interessant wanneer er of een andere structuur en/navigatie moet komen of wanneer er meerdere subsites / oplossingen beschikbaar moeten zijn.

    Martijn

  • avatar
    Reply Martijn Juurlink 25 april 2013 at 16:05

    Melvin,
    Interessante blog maar wat ik eigenlijk mis is de inleiding waarom jullie gebruik maken van een sitecollectie per project en wat hierin de voor en nadelen zijn.
    Vanuit mijn oogpunt zie ik namelijk het grote nadeel dat men beheer en onderhoud per site collectie moet gaan doen i.p.v. op hoofdniveau. Tevens is een sitecollectie naar mijn idee pas interessant wanneer er of een andere structuur en/navigatie moet komen of wanneer er meerdere subsites / oplossingen beschikbaar moeten zijn.

    De oplossing wat je hebt gebouwd, is ook per (sub)site te gebruiken dan is namelijk de vraag van Marc gelijk beantwoord aangezien men een lijst met subsites kan weergegeven.

    Martijn

    • avatar
      Reply Melvin Vermeer 1 mei 2013 at 09:58

      Hoi Martijn,
      Wij kiezen vaak voor site collecties vanwege schaalbaarheidsreden. Microsoft adviseert om content databases niet groter laten worden dan 200 GB. Als alle projectsites in 1 site collectie zitten (en dus in 1 contentdatabase) zou dat betekenen dat er een niet meer dan 200 GB aan data mag zijn voor alle projecten bij elkaar. Dit is niet erg schaalbaar.
      Hoe je alle projecten in een overzicht kunt tonen daar maak ik binnenkort een blogpost over, stay tuned.
      Melvin.

    Plaats een reactie