25 april 2014

SharePoint 2013 List Item Attachment

Het heeft even een tijdje geduurd, maar hier ben ik dan weer met een nieuwe blogpost. Het onderwerp waar ik het dit keer over ga hebben is de functionaliteit in SharePoint waarbij een document als attachment bij een list item gevoegd kan worden.

Het probleem waar ik mee geconfronteerd werd, was dat men de attachments graag als lijstje van korte klikbare links in een SharePoint 2013 app wilde weergeven. Omdat dit ietwat ingewikkelder is dan het weergeven van een willekeurige column/field uit een lijst, vind ik het de moeite waard om in een blog uit te leggen hoe je bovenstaande voor elkaar krijgt. SharePoint apps bestaan uitsluitend uit client side code, dus we gaan met javascript aan de slag.

Voor ik begin wil ik nog even vermelden dat ik deze blogpost heb kunnen schrijven dankzij mijn collega’s Mirjam van Olst en Laurens Ruijtenberg, die mij hebben geholpen het mysterie op te lossen.

Wat je nodig hebt

In deze blogpost ga ik er vanuit dat je al een werkende SharePoint omgeving hebt en een SharePoint solution, waarin je (onder andere) de list item attachments wil gaan tonen. Zelf werk ik met Visual Studio 2013, dat is het makkelijkst om SharePoint code te debuggen. De gratis versie heet Visual Studio Express en is hier verkrijgbaar.

Om list item attachments op te halen, heb je vanzelfsprekend een SharePoint list nodig. Zelf heb ik een list met de naam ‘My Items’. Deze naam zal ik, voor de duidelijkheid, ook blijven gebruiken in de code. Je kan de list aanmaken via de solution (best practice), of een list aanmaken via de user interface van SharePoint. Vul je SharePoint list alvast met wat list items en voeg wat attachments aan die items toe. Dat scheelt later weer een hoop hersenkraken over waarom het niet werkt (als er geen attachments zijn, kunnen ze immers ook niet worden weergegeven).

Verder heb je jQuery en de ‘jQuery library for SharePoint Web Services’ nodig. De laatste vind je hier. jQuery zelf kan je via Visual Studio installeren (Tools -> Extensions and Updates).

We gaan in deze blogpost uit van 3 bestanden:

  • Een HTML template waarin we onze content gaan weergeven.
  • Een Javascript bestand welke bepaald wat we gaan weergeven, hoe we het gaan weergeven en waar we het gaan weergeven. Omdat dat ik zelf met de MVC methode heb gewerkt, is in mijn geval de Javascript verdeeld over 2 lossen bestanden. Doe wat je het prettigst vind.
  • Een CSS bestand om de noodzakelijke opmaak toe te voegen.

Beginnen

In het HTML template gaan we een korte structuur aanmaken, zodat we straks een plekje hebben om de list item attachments weer te geven. Ik schrijf niet de complete SharePoint pagina uit, alleen het stukje waar het hier om gaat.

<div class="container">
<h3 id="title">Attachments</h3>
<h3 id="listAttachments"></ul>
</div>

Het is niet veel: Een div om het geheel te positioneren, een header en een lijst waarin ieder attachment straks als list item wordt ingevoegd.

Data aanroepen

Dan komen we nu toe aan het grootste en moeilijkste deel, de javascript code. Er zijn een aantal dingen die we met javascript moeten gaan regelen:

  • We moeten de applicatie gaan vertellen wat we willen zien
    De query bestaat uit XML en die moeten we gaan opbouwen via Javascript.
  • We moeten de applicatie gaan vertellen hoe we het willen weergeven.

Query

De eerste stap is het aanroepen van de SharePoint list en definiëren wat we willen zien van die list.

var MyItemsRepository = function () {
this.QueryListOptions = function (query, viewFields, options) {
var result;

$().SPServices({
operation: "GetListItems",
async: false,
listName: "My Items",
webURL: commonSiteCollectionUrl,
CAMLQuery: query,
CAMLViewFields: viewFields,
CAMLQueryOptions: options,
completefunc: function (xData, Status) {
result = xData;
}
});

return result;
}

// Verderop in de tutorial maken we nog een stukje code aan dat nodig is om de attachments op te roepen, zet die code hier
}

var myItemsRepository = new MyItemsRepository();

In dit stukje code wordt een call gemaakt naar SharePoint en wordt de list met de naam ‘My Items’ aangeroepen. Hier wordt achter de schermen de ‘jQuery library for SharePoint Web Services’ voor gebruikt. Vervolgens zien we een aantal parameters Waar de lettercombinatie CAML in staat. CAML staat voor ‘Collaborative Application Markup Language’. Dit is een op XML gebaseerde taal die in SharePoint wordt gebruikt om fields en views te definiëren. De waarden van deze CAML parameters die je in de bovenstaande code ziet, zijn variabelen die we later gaan definiëren.

CamlDesigner2013

Als je veel verstand hebt van CAML en/of XML, zou je de queries zelf kunnen schrijven. Dit is echter niet nodig, want er bestaat een heel handige tool voor: CamlDesigner2013. Deze vind je hier.

Omdat ik niet zo goed ben in CAML en XML, ga ik deze tool gebruiken om de juiste query te genereren. Als je de tool wilt gebruiken is het van belang dat je hem installeert op een machine die toegang heeft tot je SharePoint site. De CamlDesigner2013 gaat namelijk een connectie maken met de site, om de site (en dus ook onze list) uit te kunnen lezen.

Omdat deze tutorial niet over CamlDesigner gaat, ga ik niet uitgebreid beschrijven hoe het werkt. Ik vertel slechts kort welke stappen je moet nemen in de tool om het voor nu gewenste resultaat te bereiken.

  1. Verbind CamlDesigner als eerste met de SharePoint site waarin de betreffende list staat.
    Rechts bovenin staat een knop ‘Connection’.
  2. Selecteer links in het menu de juiste list (in mijn geval ‘My Items’).
  3. Nu gaan we de code genereren:
    1. Klik, in het middelste venster bovenin, op ‘Where’.
      Sleep het field ‘ID’ naar de rechterkant en typ ‘id’ in de input.
      Je ziet nu onderin de code verschijnen die je hebt gegenereerd.
    2. Klik, weer in het middelste venster bovenin, op ‘ViewFields’.
      Sleep nu het field ‘Attachments’ naar de rechterkant.
      (zie de code weer verschijnen onderin)
    3. Klik, weer in het middelste venster bovenin, op ‘Query Options’.
      Vink ‘Include Attachments URL’s’ aan.

De XML code die we nodig hebben is nu gegenereerd. We kunnen het nu gaan toepassen in het volgende stukje javascript.

Query Part II

In de Javascript code hieronder komt de code die we met de CamlDesigner hebben gemaakt weer terug. De output van de CamlDesigner is hier als waarde toegevoegd aan de variabelen (query, viewFields en options) die we in het volgende stukje code hebben aangeroepen.

Vergeleken met wat de CamlDesigner heeft uitgespuugd, maken we nog een paar kleine wijzigingen:

  1. Rondom de <Where> tag zetten we nog een <Query> tag. Dat heeft de CamlDesigner namelijk nog niet voor ons gedaan.
  2. In de <Value> tag (binnen de <Where> tag), heeft de CamlDesigner een foutje gemaakt. Die heeft er namelijk Type='Counter' van gemaakt, maar wij willen graag Type='Text' zien.
  3. In dezelfde <Value> tag willen we niet ‘id’ als onderdeel van de XML, maar we willen dat daar via Javascript de id wordt aangeroepen. Verander daarom ‘id’ naar ‘" + id + "’ zoals in onderstaande code.

Je uiteindelijke code moet dus vergelijkbaar zijn met onderstaande code.

// Plaats onderstaande code op de plaats waar de comment in het stuk code eerder in deze tutorial dat aangeeft

this.GetById = function (id) {
var query = "<Query>
<Where>
<Eq>
<FieldRef Name='ID'/>
<Value Type='Text'>" + id + "</Value>
</Eq>
</Where>
</Query>";

var viewFields = "<ViewFields>
<FieldRef Name='Attachments' />
</ViewFields>";

var options = "<QueryOptions>
<IncludeAttachmentUrls>TRUE</IncludeAttachmentUrls>
</QueryOptions>";

var data = this.QueryListOptions(query, viewFields, options);

var count = $(data.responseXML).SPFilterNode("rs:data").attr("ItemCount");

if (count > 0) {
return data;
}

return null;
}

Voor de leesbaarheid van deze tutorial heb ik wat extra linebreaks en spacing aan de code toegevoegd. Normaal gesproken staat de gehele XML code op één regel.

Back to the point: Wat doet deze code nou precies?
Als eerste wordt een anonieme function gedefinieerd, die verwijst naar de variabele ‘MyItemsRepository’ (zie het stukje javascript eerder in deze tutorial) via het this keyword. this.GetById roept dus een item uit de list ‘My Items’ aan, aan de hand van de ID’s van de items. Vervolgens zorgen de variabelen ‘query’, ‘viewFields’ en ‘options’ dat de CAML query wordt samengesteld, die de juiste gegevens uit onze SharePoint list haalt.
Hierna maken we een variabele ‘ data’ aan, die de bovenstaande 3 variabelen samenvoegt en als laatste wordt van het geselecteerde item ieder (kunnen er meerdere zijn) attachment opgehaald. Het if statement op het eind kijkt of er überhaupt attachments zijn. Als dat zo is worden ze opgehaald en als er geen attachments zijn is de output null.

Data weergeven

Nu dat we de data hebben opgehaald, gaan we door middel van Javascript bepalen hoe we die data willen weergeven. We gaan de attachments in HTML list items weergeven, we gaan er klikbare links van maken en we gaan de URL’s inkorten.

De code die dat doet ziet er als volgt uit:

var MyItemsController = function () {

var MyItem;

this.showMyItemDetails = function (I_ID) {
if (myItem != "0") {

var xData = MyItemsRepository.GetById(I_ID);

if (xData != null) {
$(xData.responseXML).SPFilterNode("z:row").each(function () {

// Attachments weergeven
if ($(this).attr("ows_Attachments")) {
liHtml = [];

var attachments = $(this).attr("ows_Attachments").split(';#');

if (attachments !== undefined && attachments != null) {
for (var i = 0; i < attachments.length; i++) {
if (attachments[i] !== undefined && attachments[i] != null) {
if (attachments[i].length > 1) {
var fileName = attachments[i].split('/');

liHtml.push('<li><a href="' + attachments[i] + '">' + fileName
[fileName.length - 1] + '<a/></li>');

}
}
};
}

$('#listAttachments').html(liHtml.join(""));
}
});
}
}
}
}

Deze code begint met het kijken of er list items zijn, en als dat zo is worden die list items opgeroepen. Vervolgens begint onder de comment ‘Attachments weergeven’ de code die de Attachments aanroept en weergeeft. Als eerste wordt het field ‘ows_Attachments’ (zo heet het attachments field in de SharePoint list) opgezocht, waarvan de inhoud vervolgens wordt omgezet in een array.

Daarna wordt de variabele ‘attachments’ aangemaakt, waarin de opgehaalde attachments worden gesplitst. Dat is nodig omdat de attachments standaard gezamenlijk als één lange string worden weergegeven. Ieder attachment begint met ;#, dus daar gaan we op splitsen. Omdat de ;# voor ieder attachment staat, inclusief voor het eerste attachment, denkt de code dat ook voor het eerste attachment nog een item is. Die moeten we eruit filteren om te voorkomen dat het resulteert in een leeg eerste (HTML) list item in de uiteindelijke output.

De volgende stap is dat we met de for loop door de attachments heen gaan. In attachments[i] zit nu de URL van het attachment. De code vervolgt zich met twee if statements. De eerste kijkt of er überhaupt attachments aanwezig zijn, de tweede kijkt of de lengte van de attachment URL (attachments[i]) groter is dan 1. Met deze laatste if filteren we het eerste lege array item dat door de split in de array terecht is gekomen.

Vervolgens gebruiken we var fileName = attachments[i].split('/'); welke zorgt dat de totale URL van het attachment wordt gesplit op de /. De fileName variabele bevat nu een array met in elk item van de array een stukje van de URL. Met behulp van fileName[fileName.length - 1] vragen we het laatste stukje van de URL van het attachment op, de echte bestandsnaam.

Hoe werkt dit dan?
Nou, fileName.length geeft het totaal aantal items in de array terug. Als de array 1 item zou bevatten dan zou fileName.length ‘1’ zijn. Omdat de index van een array bij ‘0’ begint, verwijst fileName[fileName.length] naar een niet bestaand item en dus ontstaat er een foutmelding.

Ter illustratie:

laten we nu de ‘- 1’ weg, dan zou de code, in het geval van 4 items in de array, gaan zoeken naar item nummer 4 terwijl hij nummer 3 moet hebben.

Enfin, Door bovenstaande kan je dus in plaats van een hele lange URL, alleen de bestandsnaam weergeven, wat het lijstje attachments een stuk leesbaarder maakt.

In de regel erna worden de attachments in een <li> en een <a> gestopt, zodat de output een keurige HTML list wordt met een klikbare link in ieder list item. De laatste regel vervolgens, koppelt de output aan de <ul> met het id (#) listAttachments, zodat onze output in dat element wordt weergegeven.

Afronden

We zijn er bijna. Het laatste wat we nu nog gaan doen is een paar regeltjes CSS toevoegen, zodat onze HTML output toonbaar is. Natuurlijk kan je dit zelf naar wens aanpassen.

#container {
float:left;
height:200px;
width:300px;
}

#container h3 {
float:left;
width:100%;
}

#listAttachments {
float:left;
width:100%;
margin:10px 0;
padding:0;
}

#listAttachments li {
float:left;
width:100%;
margin:5px 0;
}

Bovenstaande CSS zorgt voor een box van 200x300 pixels met bovenin de header ‘Attachments’ en daaronder de lijst met attachments, keurig onder elkaar weergegeven met wat ruimte tussen ieder element.

Nu is het tijd om je solution te deployen. Als je solution is geïnstalleerd en de feature(s) is/zijn geactiveerd, zie je nu je attachments op de pagina waarop je de HTML hebt toegevoegd.

08 november 2012

Managed Metadata Navigatie in SharePoint 2013

In deze blogpost leg ik uit hoe je de nieuwe Managed Metadata navigatie functionaliteit van SharePoint 2013 kan configureren op een hiërarchie met meerdere site collecties. Ik ga er in deze handleiding van uit dat je al meerdere site collecties hebt, waarin je de Managed Metadata navigatie wilt toepassen.

Content Type hub

In het geval van meerdere site collecties is het aan te raden een ‘Content Type hub’ aan te maken. Dit is een site collectie die functioneert als host voor al je metadata, waaronder content types, fields/columns, terms, tags, etc. De overige site collecties kunnen gebruik maken van de metadata die opgeslagen is in de content type hub.
Een Content Type hub maak je als volgt aan:
  1. Open Central Administration en navigeer naar Applicaton management -> Create site collections.
  2. Maak een site collectie aan die je als Content Type hub gaat gebruiken. Geef de site collectie een herkenbare naam zoals ‘cth’ (afkorting voor Content Type hub). Je kunt gewoon een willekeurig template gebruiken, want je doet verder niets met deze site (je gebruikt hem alleen als host).
  3. Navigeer binnen Central Administration naar Application Management -> Manage Service Applications.
  4. Klik in de ribbon op New -> Managed Metadata Service.
  5. Vul het formulier in. Geef het wederom een herkenbare naam, zodat je je nieuwe Managed Metadata Service Application straks makkelijk terug vind. Vul verder de juiste Database Server in en stel een Application pool in. In het veld Content Type hub vul je de URL van de site collectie uit stap 2 in. Klik ten slotte op Save.
  6. De nieuwe Managed Metadata Service staat nu in het overzicht. Hierbij zijn twee regels zichtbaar, waarbij het onderscheid zichtbaar is onder de kolom Type’. Hier kan je zien dat er een Managed Metadata Service is, met daaronder een Managed Metadata Service Connection.
  7. Controleer of je Managed Metadata Service de status Started (rechts in beeld) heeft en publiceer hem nog even voor de zekerheid. Je kunt het publiceren door de bovenste regel (onder Type staat Managed Metadata Service) aan te klikken, en vervolgens in de ribbon op Publish te klikken.
  8. Klik nu op de onderste regel (onder Type staat Managed Metadata Service Connection).
    Je Term Store Management Tool wordt nu geopend, hier gaan we straks mee verder.
  9. Open, in een nieuw venster, de site collection die als Content Type hub dient.
  10. Ga naar Site Settings en klik op Site Collection Features (te vinden onder het kopje Site Collection Administration).
  11. Activeer de feature Content Type Syndication Hub.
De Content Type hub is nu aangemaakt en klaar voor gebruik. Voor het gemak van deze handleiding heb ik je in stap 7 alvast de Term Store Management Tool laten openen. Hierin gaan we nu onze navigatie in aanmaken.

Navigatie aanmaken

De navigatie bestaat uit Terms welke verzameld zijn in een Term Set. Term Sets worden weer verzameld in Groups. Laten we beginnen:
  1. Als je in de Term Store Management Tool in het linker venster kijkt, zie je de onderdelen die al in de Term Store staan. Waarschijnlijk zie je nog niets, behalve een regel met de naam van de Managed metadata Service en een mapje dat System heet. Hover met je muis over de naam van je Managed Metadata Service en je ziet een pijltje verschijnen aan de rechterkant. Klik op het pijltje en selecteer New Group.
  2. Geef de nieuwe Group een herkenbare naam zoals ‘Site Navigation’.
  3. Hover nu met de muis over de nieuwe Group en klik wederom op het pijltje. Selecteer nu New Term Set.
  4. Een van de problemen die ik tegen ben gekomen is dat maar 1 site collectie gebruik kan maken van een term set. Om deze reden zullen we dus voor iedere site collectie een nieuwe Term Set aan moeten maken. Gelukkig kunnen in die Term Sets, de Terms hergebruiken. We gaan nu dus eerst de verschillende Term Sets aanmaken, maar we gaan slechts in 1 Term Set de Terms aanmaken. Als dat klaar is, dan hergebruiken we die Terms in de overige Term Sets.
  5. Geef de nieuwe Term Set die je in stap 3 hebt aangemaakt een herkenbare naam. Houdt hierbij rekening met het feit dat iedere site collectie een eigen Term Set krijgt. Het is dus handig om je Term Set te vernoemen naar de site collectie waar je hem straks op gaat toepassen.
  6. Klik op de Term Set en klik in het grote rechter venster bovenin op het tabje INTENDED USE. Zet een vinkje bij Use this Term Set for Site Navigation.
  7. Herhaal stap 3, 4 en 5 voor iedere site collectie waarop je de navigatie wilt toepassen.
  8. Hover nu over 1 van je Term Sets en klik weer op het pijltje. Selecteer New Term en geef de nieuwe Term een naam.
  9. Je hebt nu de eerste echte link voor het menu aangemaakt. De naam van de Term is wat je straks ziet in het menu, houdt hier dus rekening mee als je de Term een naam geeft.
  10. Herhaal Stap 7 tot je alle gewenste links voor het menu hebt aangemaakt.
  11. Klik op een Term en klik op het tabje NAVIGATION in het grote scherm rechts. Klik de radiobutton bij Simple Link or Header aan en vul de URL in waar deze link straks in het menu naar moet gaan verwijzen. Deze URL komt uit een andere site collectie, dus de Browse-knop heeft hier geen zin. Zoek zelf de URL op en vul deze handmatig in.
  12. Klik op het tabblad GENERAL en controleer in het veld Member Of of de juiste Source Term is geselecteerd. Zo niet, verbeter deze dan.
  13. Herhaal stap 9 en 10 voor iedere term die in je menu moet komen.
  14. Hover over een van overige Term Sets die je hebt aangemaakt voor je andere site collections en klik op het pijltje. Selecteer nu Reuse Terms.
    Voeg alle Terms toe die je in het menu van de site collectie, waarop deze Term Set van toepassing is/wordt, wilt zien.
  15. Klik op de Term Set en selecteer het tabblad CUSTOM SORT. Klik de radiobutton bij Use custom sort order aan en zet de Terms in de gewenste volgorde.
  16. Herhaal stap 12 en 13 voor alle Term Sets.
De menu’s voor alle site collecties zijn nu klaar.

Navigatie toepassen

Nu dat de menu’s klaar zijn, moeten ze worden toegepast op de site collecties.
  1. Om de topnavigatie te kunnen bewerken moet een bepaalde feature aan staan. Ga naar de site collectie waarop je de navigatie wilt activeren.
  2. Ga naar Site Settings en vervolgens naar Site Collection Features (te vinden onder het kopje Site Collection Administration). Activeer de feature SharePoint Server Publishing Infrastructure.
  3. Ga nu (nog steeds binnen Site Settings) naar Navigation (te vinden onder het kopje Look and Feel).
  4. Klik, onder het kopje Global Navigation, de radiobutton bij Managed Navigation: The navigation items will be represented using a Managed Metadata term set aan.
  5. Scroll nu omlaag naar het kopje Managed Navigation: Term Set, zoek in het venstertje de juiste Term Set op en klik deze aan.
  6. Klik helemaal onderin het scherm op OK.
De navigatie zou nu zichtbaar moeten zijn op de pagina’s van je site collectie. Mocht dit niet het geval zijn, dan kan je nog even de timer job Application Server Administration Timer Job handmatig starten. Deze is te vinden in Central Administration onder Monitoring -> Check job status.

12 juli 2012

SharePoint 2010 solution maken in Visual Studio

Dit is een stap-voor-stap handleiding voor het maken van een design solution in Visual Studio. De solution is tevens geschikt voor language packs en Variations. Om deze handleiding te volgen heb je geen voorkennis van Visual Studio nodig. Bij alle stappen wordt nauwkeurig uitgelegd wat je moet doen en waarom dat nodig is.

Voorbereiding

Er zijn een aantal dingen die je moet doen voordat we een nieuw project gaan aanmaken. Later in deze handleiding zal vanzelf duidelijk worden waarom dit nodig is. Bij deze handleiding wordt ervan uit gegaan dat de SharePoint Site (collection) waarop het design moet worden toegepast al bestaat. Zorg dus dat je eerst de Site(collection) waarop je design moet worden toegepast, al aanwezig is.

Hostfile

Om je SharePoint site in een browser te kunnen opvragen, moet je deze eerst in de hostfile op je computer zetten. Doe je dit niet, dan geeft de browser aan dat de site niet gevonden kan worden. Je kunt je site als volgt aan de hostfile toevoegen:
  1. Open Notepad/Kladblok via de Run as administrator optie.
  2. Klik op Open en navigeer naar de volgende locatie:
    C:\Windows\System32\drivers\etc
  3. Zorg dat alle bestandstypen worden weergegeven.
  4. Open hosts en voeg onderin het ip-nummer (Tab er tussen) en de url van je site toe. Als je site op dezelfde machine staat als de browser waarmee je hem wilt openen kan je localhost (127.0.0.1) gebruiken.
  5. Sla het bestand op en sluit Notepad/Kladblok af.

Rechten

In principe werk je altijd met een SharePoint Administrator account (meestal is dit 'sp_admin'). Dit om de rechten zoveel mogelijk te beperken. De lokale Administrator (dat is Administrator op de server) heeft namelijk alle rechten, waardoor er gemakkelijk fouten gemaakt kunnen worden. Zorg er dus voor dat voor je met deze handleiding begint, het SharePoint Administrator account rechten heeft op de content database van je site collectie. Is dat niet het geval, dan doe je dat als volgt:
  1. Open SQL Server Management Studio via de Run as different user optie.
    (Houdt Shift ingedrukt terwijl je met de rechtermuisknop klikt om deze optie zichtbaar te maken)
  2. Log in als Administrator en klik vervolgens op Connect
  3. Klik op Databases -> Voorbeeld_WSS_Content -> Security -> Users
    (Vul in het groene gedeelte je eigen content database in)
  4. Klik met je rechtermuisknop op Users en vervolgens op New User...
  5. Vul de volgende gegevens in:
    • User name: sp_admin
    • Login name: Domein\sp_admin
      (Let op: Het domein moet erbij worden vermeld)
  6. Vink bij Owned Schemas en Role Members de optie db_owner aan.
  7. Sluit SQL Server Management Studio.

CKSDev

Als je je solution vanuit Visual Studio deployt, dan wordt er altijd een IIS reset uitgevoerd. Op het moment dat je de veranderingen die je maakt, wilt testen, is het nogal tijdrovend om telkens op de IIS reset te moeten wachten. Daar kan de tool CKSDev ons mee helpen. CKSDev heeft een optie waarmee je de bestanden uit de solution slechts naar de SharePoint root kopieert. De IIS reset is zo niet nodig en je kan toch je werk testen. De installatie:
  1. Klik op Tools -> Extension Manager.
  2. Klik op Online Gallery in de linker kolom en type vervolgens in het zoekveld ‘CKSDev’ in.
  3. Selecteer het bovenste zoekresultaat en klik op Download.
  4. Installeer CKSDev en herstart vervolgens Visual Studio via de Run as administrator optie.

Start

Nu kunnen we beginnen met het aanmaken van de solution in Visual studio. Om te beginnen open je Visual Studio via de Run as administrator optie. Dit moet je altijd doen (dus ook als je een volgende keer verder gaat werken aan je solution), omdat je anders de juiste rechten niet hebt om je solution te deployen.

Nieuw Project aanmaken

Hieronder vertel ik hoe je je eigen project kunt starten in Visual Studio. Zorg het voor dat je Visual Studio hebt geopend via de Run as Administrator optie.
  1. Klik op New Project. Dit kan via de Start Page of via File -> New Project.
  2. Controleer of in de linkerkolom SharePoint -> 2010 geselecteerd is en klik op Empty SharePoint Project in de middelste kolom.
  3. Vul onderin het scherm de naam van je project in.
    Als je de naam invult, dan past de Solution Name zich automatisch aan. Dat kan je zo laten.
  4. Vul de juiste locatie in om de bestanden uit de solution op te slaan. Maak hiervoor een nieuwe map aan op de c-schijf, die je makkelijk kan terugvinden.
  5. Klik op OK.
  6. Vul, in het venster dat nu is verschenen, de URL van je site collection in.
  7. Selecteer Deploy as a farm solution en klik op Finish.
  8. Ga naar Solution Explorer (Tabje in de kolom rechts in beeld) en klik op je project/solution.
  9. Onderin de kolom verschijnen nu de Properties van je solution. Zet de eigenschap Include Assembly in Package op False.
  10. Klik met je rechter muisknop op je project/solution en klik op Deploy.
  11. Controleer in Central Administration of je solution is gedeployed. Ga hiervoor naar System Settings -> Manage Farm Solutions.

Managed Folders

De volgende stap is het aanmaken van Managed folders. Deze zijn bedoeld om de locaties vast te leggen waar de onderdelen van de solution moeten worden opgeslagen. De locatie is niet altijd op iedere server exact hetzelfde. Managed folders zorgen er voor dat de juiste locatie altijd word gevonden door te werken vanuit een root, die niet aan een vaste locatie gebonden is.
  1. Klik in de Solution Explorer met de rechter muisknop op je solution en klik vervolgens op Add -> SharePoint “Layouts” Mapped Folder.
  2. Herhaal voorgaande eventueel voor de SharePoint “Images” Mapped Folder
  3. Voeg een item toe aan de Mapped Folder. Dit is nodig omdat een lege map niet wordt gedeployed, je kan dan dus niet controleren of alles werkt. Na de controle kan je het bestand eventueel weer weggooien.
  4. Deploy je solution.
  5. Controleer of je bestanden naar de SharePoint root zijn gekopieerd door in je verkenner het volgende adres op te zoeken:
    Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\

Modules

Modules worden gebruikt om bijvoorbeeld je Masterpages en Page Layouts op te slaan.
  1. Klik met je rechter muisknop op de solution en kies voor Add -> New Item.
  2. Selecteer in de linker kolom SharePoint -> 2010 en in de middelste kolom Module.
  3. Geef de module een representatieve naam (Bijvoorbeeld: MasterPages) en klik op Add.
  4. Verwijder Sample.txt.
  5. Klik met de rechter muisknop op de module en kies Add -> New Item.
  6. Selecteer het bestand van je keuze en geef het een representatieve naam.
  7. De kans is aanwezig dat Visual Studio het nieuwe bestand ongevraagd en onaangekondigd in de Mapped Folder 'Layouts' Plaatst. Zwaar irritant, maar ik heb nog niet kunnen vinden waarom dit gebeurt en hoe je het kan voorkomen. Mocht dit dus zo zijn, sleep het bestand dan terug naar je module. Je kan ook alle bestandjes (met de .cs extensie) die onder het bestand hangen weg gooien, die heb je niet nodig.

Features

Een feature is o.a. de aan/uit knop van je solution. Features zijn terug te vinden in de Central Administration (Scope: farm), de Site Collection Features (Scope: Site), of de Site Features (Scope: Web). Bij iedere feature staat een knop Activate/Deactivate, waarmee je vanzelfsprekend de feaure aan of uit kunt zetten. Het voordeel hiervan is prestatie. Hoe minder features actief zijn, hoe sneller je site zal zijn. Verder hoef je een solution ook niet geheel te rectracten/verwijderen als je hem (tijdelijk) niet wilt gebruiken.
  1. Klik in de Solution Explorer met je rechter muisknop op Features en klik vervolgens op Add Feature.
  2. Rename de feature naar een representatieve naam. Het is aan te raden om de scope in de naam te verwerken. Zo zie je in één oogopslag waar je de feature terug kunt vinden. (Bijvoorbeeld ‘Site.Pages’ of Web.Lists)
  3. Open de feature (indien dit niet vanzelf gebeurd) en vul een titel in.
  4. Stel de Scope in. (Zie het scopes-overzicht hieronder om te bepalen welke scope je nodig hebt.)
  5. Deploy je solution.
  6. Controleer of je feature er tussen staat. (Zie het scopes-overzicht hieronder om te bepalen waar je je feature terug kunt vinden.)

Scopes

De scope bepaald op welk niveau de feature word gedeployed. Er zijn 4 scopes beschikbaar:
Scopes overzicht SharePoint 2010
In de praktijk zal je bij de meeste design solutions alleen gebruik maken van de scopes Site en Web.

Resources

Resources worden onder andere gebruikt om namen variabel te maken, zodat deze bijvoorbeeld automatisch worden vertaald als de SharePoint site in verschillende talen beschikbaar is. Daarnaast gebruiken we resources om bijvoorbeeld namen te geven aan onze eigen Columns en Content Types, hierover in later meer.

Resources aanmaken

  1. Klik met je rechter muisknop op de solution en klik vervolgens op Add -> SharePoint Mapped Folder.
  2. Kies de map Resources en klik op OK.
  3. Klik met je rechter muisknop op de Resources folder die je zojuist hebt aangemaakt en klik vervolgens op Add -> New Item.
  4. Selecteer in de linker kolom Visual C# -> General en in de middelste kolom Resources File.
  5. Geef de Resources File dezelfde naam als je solution en klik op Add (deze Resource File is in het Engels, Engels is default en je hoeft dus ook geen extra Resource File voor Engels te maken).
  6. Maak eventueel extra Resources Files voor andere talen en vermeld de taal in de naam (bijvoorbeeld ‘Voorbeeld.Solution.SP2010.nl-NL’ voor Nederlands)
  7. Dubbelklik op Package in de Solution Explorer (rechts in beeld) en selecteer onder in beeld het tabblad Manifest.
  8. Scroll naar beneden en klik op Edit Options.
  9. Pas de Manifest Template aan zodat deze vergelijkbaar is met onderstaande:
    Resource XML voor SharePoint 2010
    (Vul op de groene gedeelten je eigen waarden in)
  10. Deploy de solution.
  11. Controleer in de SharePoint root of de bestanden er staan.
    (Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Resources\)
  12. Controleer in de AppGlobalResources of de bestanden er staan.
    (inetpub\wwwroot\wss\VirtualDirectories\Voorbeeld.domein.local80\App_GlobalResources\ Resources\)
    (Vul in het groene gedeelte je eigen Web Applicatie in)

Resources gebruiken

  1. Dubbelklik op een Resource File die je hebt aangemaakt. Deze staat in de Solution Explorer.
  2. Vul bij Name de waarde ‘FeatureTitle’ in en bij Value een representatieve naam. (bijvoorbeeld: Design Template)
  3. Herhaal stap 2, alleen vul dan bij Name ‘FeatureMetaDataTitle’ in. Vul bij Value hetzelfde in als bij stap 2.
  4. Herhaal stap 1, 2 en 3 voor de eventuele Resource Files voor andere talen en vertaal steeds de waarde bij Value (dus niet bij Name, dat blijft steeds FeatureTitle en FeatureMetaDataTitle).
  5. Dubbelklik op de feature die je eerder hebt aangemaakt (Staat in de Solution Explorer).
  6. Vul bij de Properties (rechts onderin beeld, onder de Solutions Explorer) bij Default Resource File de naam van je eerste Resource File in (dus de default Engelse) en laat de .resx extensie weg. Dit is nu dus hetzelfde als de naam van je solution.
  7. Vul nu bij Title (in het grote venster links) het volgende in: $Resources: Voorbeeld.SP2010.Branding, FeatureTitle;
    (Vul bij het groene gedeelte je eigen waarde in. Dit is dezelfde waarde als die je zojuist bij Properties hebt ingevuld)
  8. Sla alles op.
  9. Deploy de solution.
  10. Controleer bij de Site Collection Features of de solution nu de naam heeft die je bij stap 2 als Value hebt ingevuld.

Onderdelen

Hieronder een overzicht van de verschillende onderdelen die je aan je solution kunt toevoegen. Je hoeft uiteraard niet alles toe te voegen, gebruik alleen wat je nodig hebt.

MasterPages

  1. Klik met je rechter muisknop op de solution en kies voor Add -> New Item.
  2. Selecteer in de linker kolom SharePoint -> 2010 en in de middelste kolom Module.
  3. Noem de module 'MasterPages' en klik op Add.
  4. Rename Sample.txt en pas daarbij de .txt extensie aan naar .master (Bijvoorbeeld: Voorbeeld.master).
  5. Pas Elements.xml aan zodat deze vergelijkbaar word met onderstaande:
    Elements.xml van de MasterPages module voor SharePoint 2010
    (Vul op de groene gedeelten je eigen waarden in)
  6. Kopieer de code van een standaard V4 masterpage en plak deze in je eigen masterpage.
  7. Dubbelklik op de feature die je eerder hebt aangemaakt en controleer of de module MasterPages in het Items in the Feature vak staat. Zo niet, zet de module daar dan in.
  8. Deploy de solution.
  9. Ga naar je site (Site Settings -> Master page), controleer of je masterpage tussen de beschikbare masterpages staat en activeer deze bij Site Master Page (Let op: Dus niet bij 'System Master Page'). Zet ook een vinkje bij Reset all subsites for default Masterpage.

Page Layouts

  1. Voeg een module aan de solution toe en noem deze 'PageLayouts'.
  2. Verwijder het Sample.txt bestand in de module.
  3. Klik met de rechter muisknop op de module PageLayouts en klik op Add -> New Item.
  4. Selecteer in de linker kolom SharePoint -> 2010 en in de middelste kolom Application Page.
  5. Geef de pagina een representatieve naam (Bijvoorbeeld HomePage.aspx).
  6. Het kan nu zo zijn dat Visual Studio het bestand in de mapped Folder Layouts zet. Zwaar irritant, maar ik heb nog niet kunnen vinden waarom dit gebeurt en hoe je het kan voorkomen. Mocht dit dus zo zijn, sleep het bestand dan terug naar de module PageLayouts. Je kan ook alle bestandjes die onder het .aspx bestand hangen weg gooien, die hebben we niet nodig.
  7. Pas de Elements.xml van de module PageLayouts aan zodat deze vergelijkbaar word met onderstaande:
    Elements.xml van de Page Layouts module voor SharePoint 2010
    (Vul bij de groene gedeelten je eigen waardes in)
  8. Dubbelklik op de Feature waarin je MasterPages module staat.
  9. Verplaats de Module PageLayouts naar het vak Items in the Feature.
  10. Deploy de solution.
  11. Controleer of de nieuwe Pagelayout(s) aanwezig is/zijn op je site (Site Settings -> Master pages and page layouts)

CSS

  1. Klik met de rechter muisknop op de Layouts folder en klik vervolgens op Add -> New Folder. Geef deze folder een naam die representatief is voor je project. Bijvoorbeeld de naam van je project.
  2. Klik met de rechter muisknop op de folder die je zojuist hebt aangemaakt en klik vervolgens op Add -> New Folder. Noem deze folder 'CSS'.
  3. Klik met de rechter muisknop op de folder CSS en klik vervolgens op Add -> New Item.
  4. Selecteer in de linker kolom Visual C# -> Web en in de middelste kolom Style Sheet.
  5. Vul onderin de naam van het stylesheet in. Noem het 'styles.css'.
  6. Herhaal stap 3, 4 en 5 twee keer en noem de stylesheets 'layouts.css' en 'text.css'. Voeg eventueel nog stylesheets toe voor mediaqueries m.b.t. responsive webdesign als je dit wilt toepassen.

XSL

Let op: Gebruik alleen XSLT als je weet wat je doet. XSL gaat met ieder typefoutje stuk en helaas kan niet worden getraceerd waar de fout zit. Het herstellen van zo'n fout is dus niet zo makkelijk. Zorg hoe dan ook altijd voor een kopie van het een werkend exemplaar.
  1. Klik met je rechter muisknop op de solution en kies voor Add -> New Item.
  2. Selecteer in de linker kolom SharePoint -> 2010 en in de middelste kolom Module.
  3. Noem de module 'XSL' en klik op Add.
  4. Rename Sample.txt en pas daarbij de .txt extensie aan naar .xsl (Bijvoorbeeld: itemstyle.xsl).
  5. Pas Elements.xml aan zodat deze vergelijkbaar word met onderstaande:
    Elements.xml van de XSL module voor SharePoint 2010
    (Vul bij de groene gedeelten je eigen waardes in)
  6. Dubbelklik op de feature die je eerder hebt aangemaakt en controleer of de module XSL in het Items in the Feature vak staat. Zo niet, zet de module daar dan in.

Fields

Field is eigenlijk niet helemaal de goede benaming, het zijn eigenlijk Columns en in columns word metadata opgeslagen. Het nut hiervan zit m voornamelijk in de vindbaarheid van items/documenten in Search, maar ook in de toepassing van verschillende talen. We kunnen een set van columns maken die, voor iedere taal die we op de SharePoint site toepassen, automatisch vertaald worden. Dit doen we met Resources, waarover die we eerder in deze handleiding al hebben besproken.
  1. Klik met je rechter muisknop op Features (in de Solution Explorer) en klik op Add Feature.
  2. Geef de feature een representatieve naam (Bijvoorbeeld: Site.Fields).
  3. Vul bij Title het volgende in:
    $Resources: Voorbeeld.SP2010.Branding, FeatureMetaDataTitle;
    Vul in het groene gedeelte je eigen waarde in, dit is hetzelfde als de naam van default resource (Engels).
  4. Vul bij de Properties (rechts onderin beeld, onder de Solutions Explorer) bij Default Resource File de naam van het eerste Resource File (de Engelse dus) in en laat de .resx extensie weg. Dit is nu dus hetzelfde als de naam van je solution.
  5. Dubbelklik op op je default Resource File (Engels) en vul bij Name de waarde ‘GroupFieldsTitle’ in en bij Value een naam voor je eigen kolommen (Bijvoorbeeld: Design Template Columns).
  6. Herhaal stap 5 nog een keer en vul hierbij onder Name ‘FieldTextName’ in. De GroupFieldsTitle uit stap 5 is de groepsnaam van je custom columns, FieldTextName is je eerste eigen column. Vul eens gekke waarden in (bijvoorbeeld ‘Pindakaas’) bij Value om straks mee te testen.
  7. Klik met je rechter muisknop op je solution en klik op Add -> New Folder.
  8. Noem de folder ‘Fields’.
  9. Klik met je rechter muisknop op de folder Fields en klik vervolgens op Add -> New Item.
  10. Selecteer in de linker kolom SharePoint -> 2010 en in de middelste kolom Empty Element.
  11. Noem het bestand ‘Fields’.
  12. Pas de Elements.xml aan zodat deze vergelijkbaar is met onderstaande:
    Elements.xml van de Fields module voor SharePoint 2010
    (Vul bij de groene gedeelten je eigen waardes in). Bij ID vul je een GUID in. Deze kan je aanmaken zoals uitgelegd in het hoofdstuk Guides. Bij de overige groene gedeelten vul je de naam van je default Resource File (Engels) in.
  13. Alle attributen van fields kun je bekijken op:
    http://msdn.microsoft.com/en-us/library/aa979575.aspx
  14. Dubbelklik op de feature die je in stap 1 hebt aangemaakt.
  15. Verplaats Fields naar Items in the Feature.
  16. Deploy je solution.
  17. Controleer of het Field is aangemaakt (Site Settings -> Site Columns, hier kan je nu de waarden van Value uit stap 6 zien).

Content Types

Een Content Type is een verzameling van columns(fields), metadata, policies, properties, forms, templates en workflows, die kunnen worden toegepast op meerdere items/documenten, zonder dat dit steeds opnieuw gespecificeerd hoeft te worden. Zo kan er veel worden geautomatiseerd en bespaar jezelf een enorme hoeveelheid tijd.

Content Types aanmaken

  1. Klik met je rechter muisknop op je solution en klik op Add -> New Folder.
  2. Noem de folder ‘ContentTypes’.
  3. Klik met je rechter muisknop op de folder ContentTypes en klik vervolgens op Add -> New Item.
  4. Selecteer in de linker kolom SharePoint -> 2010 en in de middelste kolom Empty Element.
  5. Noem het bestand ‘ContentTypes’.
  6. Pas de Elements.xml aan zodat deze vergelijkbaar is met onderstaande:
    Elements.xml van de Content Type module voor SharePoint 2010
    Vul bij de groene gedeelten je eigen waardes in en laat het content type erven van Item. Bij ID doe je drie dingen:
    1. Je genereert een GUID zoals uitgelegd in het hoofdstuk ‘Guides’ en je plakt hem bij ID. (Let op: Geen parentheses)
    2. Je laat het Content Type erven van Item: Voor de GUID plak je de id van het parent content type, in dit geval: Item. Deze plak je er dus gewoon voor, zonder spaties of wat dan ook. Je ziet dus: 0x01metjeGUIDermeteenachteraan.
    3. Haal alle streepjes weg uit de GUID, zodat het één lang nummer wordt.
    4. Bij de overige grijze delen vul je de naam van je default Resource File (Engels) in.
  7. Meer informatie over Content Type ID’s kun je bekijken op:
    http://msdn.microsoft.com/en-us/library/ms452896.aspx
  8. Dubbelklik op op je default Resource File (Engels) en vul bij Name de waarde ‘GroupContentTypeTitle’ in en bij Value een verzamelnaam voor je eigen Content Types (Bijvoorbeeld: Chantals custom Columns)
  9. Herhaal stap 8 nog een keer en vul hierbij onder Name ‘CTItemName’ in. De GroupContentTypeTitle uit stap 8 is de naam van de group van je custom columns, CTItemName is je eerste eigen Content Type. Vul eens gekke waarden in (bijvoorbeeld ‘Pindakaas’) bij Value om mee te testen.
  10. Als je standaard Columns toe wilt voegen aan je Content Type kun je de GUIDs hier opzoeken:
    http://sharepointmalarkey.wordpress.com/2010/10/12/sharepoint-internal-field-names-sharepoint-2010/
  11. Deploy de solution.
  12. Controleer of het Content Type is aangemaakt (Site Settings -> Site Content Types, hier kan je nu de waarden van Value uit stap 8 en 9 zien).
  13. Herhaal stap 6, maar laat nu het Content Type overerven van Document (0x0101). Je kunt het nieuwe Content Type gewoon toevoegen aan de bestaande Elements.xml. De code voor het nieuwe Content Type moet vergelijkbaar zijn met onderstaande:
    Elements.xml van de Content Type module voor SharePoint 2010
    (Vul bij de groene gedeelten je eigen waardes in)
  14. Deploy de solution.
  15. Controleer of het Content Type is aangemaakt (Site Settings -> Site Content Types, hier kan je nu de waarden van Value uit stap 9 zien).

Content Types inrichten

In deze les gaan we kort in op het inrichten van Content Types. we gaan Columns toevoegen aan de Content Types toevoegen. De Columns bevatten metadata die iets zeggen over de items/documenten die onder dit Content Type vallen. Zo worden de items/documenten bijvoorbeeld veel makkelijker vindbaar in Search.
  1. Dubbelklik op de Elements.xml die in de folder ContentTypes staat.
  2. Pas de code per Content Type aan zodat deze vergelijkbaar wordt met onderstaande:
    Elements.xml van de Content Type module voor SharePoint 2010
    Vul in de grijze gedeelten je eigen waarden in. De GUIDs voor alle FieldRefs heb je al aangemaakt in de Elements.xml die in de map Fields staat. Deze kan je dus gewoon kopiëren. De velden die je hebt aangemaakt in Fields, roep je aan in je Content Types. Je hoeft niet perse alle velden aan te roepen. Gebruik wat je nodig hebt.
  3. Sla alles op en deploy de solution.
  4. Controleer of de columns in het Content Type zijn aangemaakt. (Site Settings -> Site Content Types -> Jouw Content Type, Als je je content type hebt aangeklikt zie onder Columns of je columns er bij staan)

Lists

  1. Klik met je rechter muisknop op je solution en klik op Add -> New Folder.
  2. Noem de folder ‘Lists’.
  3. Klik met je rechter muisknop op de folder Lists en klik vervolgens op Add -> New Item.
  4. Selecteer in de linker kolom SharePoint -> 2010 en in de middelste kolom Empty Element.
  5. Noem het bestand ‘Lists’.
  6. We gaan een List van het type Generic List maken. Pas de Elements.xml aan zodat deze vergelijkbaar is met onderstaande:
    Elements.xml van Lists voor SharePoint 2010
    (Vul bij de groene gedeelten je eigen waardes in)
  7. Feature ID's en TemplateTypes kun je opzoeken op: http://karinebosch.wordpress.com/walkthroughs/create-custom-lists-in-caml-based-on-existing-list-templates/
  8. Maak een feature aan en noem deze 'Web.Lists'.
  9. Open de feature (indien dit nog niet is gebeurd) en vul bij Title het volgende in:
    $Resources: Voorbeeld.SP2010.Branding, FeatureListsTitle;
    (Vul in het groene gedeelte je eigen waarde in)
  10. Vul bij Description het volgende in:
    $Resources: Voorbeeld.SP2010.Branding, FeatureListsDescription;
    (Vul in het groene gedeelte je eigen waarde in.
  11. Zet de Scope op Web (Dit zorgt er voor dat de feature op site-niveau aan/uit gezet kan worden).
  12. Deploy de solution.
  13. Controleer of je List er staat. Dit doe je door op je site onder All Site Content -> Lists te kijken.

Web Templates

Een web template is een verzameling van eigenschappen die worden toegepast op een site die je op basis van het template aanmaakt. Hieronder kunnen bijvoorbeeld eigenschappen vallen, die we hierboven hebben aangemaakt: Design, lijsten, bibliotheken, metadata, web parts, pagina’s, etc.
  1. Maak een folder aan in je solution en noem deze 'WebTemplates'.
  2. Voeg een Empty Element toe aan de folder en geef het een representatieve naam (bijvoorbeeld: ChantalsWebTemplate).
  3. Pas de Elements.xml aan zodat deze vergelijkbaar word met onderstaande:
    Elements.xml van Lists voor SharePoint 2010
    Vul op de groene gedeelten je eigen waardes in
  4. Voeg de waarden 'TemplateCustom', 'TemplateDescription' en 'TemplateCategory' toe aan je Resource Files.
  5. Klik met je rechter muisknop op het Element dat je zojuist hebt aangemaakt en kies voor Add -> New Item.
  6. Selecteer in de linker kolom Visual C# -> Data en in de middelste kolom XML File.
  7. Noem het bestand 'ONET.xml' en pas de code dusdanig aan dat deze vergelijkbaar wordt met onderstaande. Hierbij kan je zelf bepalen wat je in het web template wilt opnemen.
    ONET.xml voorbeeld
    (Vul op de grijze gedeelten je eigen waardes in)
  8. Voeg naar wens Features toe. Gebruik hiervoor de tag en zet deze in de juiste scope.
  9. Klik op ONET.xml en verander bij Properties (onder de Solution Explorer) het Deployment Type naar ElementFile.
  10. Maak een feature aan en noem deze 'Site.Templates'.
  11. Open de feature (indien dit nog niet is gebeurd) en vul bij Title het volgende in:
    $Resources: Voorbeeld.SP2010.Branding, FeatureTemplateTitle;
    (Vul in het groene gedeelte je eigen waardes in)
  12. Vul bij Description het volgende in:
    $Resources: Voorbeeld.SP2010.Branding, FeatureTemplateDescription;
    (Vul in het groene gedeelte je eigen waardes in)
  13. Verplaats het WebTemplates Element naar het vak Items in the Feature.
  14. Voeg 'FeatureTemplateTitle' en 'FeatureTemplateDescription' toe aan je Resource Files.
  15. Klik (in het Visual Studio topmenu) op Project -> Show All Files.
  16. Klik (in de Solution Explorer) op het +je van de folder Lists en van het Element Lists.
  17. Dubbelklik op SharePointProjectItem.spdata.
  18. Pas de code aan zodat deze het zelfde word als onderstaande:
    SharePointProjectItem.spdata
  19. Sla op en sluit het bestand. Klik weer (in het Visual Studio topmenu) op Project -> Show All Files.
  20. Deploy de solution.
  21. Controleer of je Web Template beschikbaar is. (Site Actions -> New Site. Je zou nu je eigen template moeten kunnen kiezen als basis voor een nieuwe site)