Best practice for oprettelse af sharepoint lister er gennem sharepoint features. Oprettelsen af sharepoint lister skal med andre ord ske gennem aktivering af features, og ikke gennem afvikling af *.exe filer, man har kodet til det formål. Hvorfor er det best practice? Det er det af den simple grund, at man udnytter Sharepoint mulighederne fuldt ud, og placerer administrations delen i CA (Central Adminitration). STSAdm kommandoer bundlet i scripts kan herefter simulere de administrative klik man ellers ville foretage i CA. Selvom sharepoint api'et er tilgængeligt i kode, skal man tænke sig godt om og have en god grund til at oprette lister herigennem.

Dette indlæg vil handle om, hvordan man opretter sharepoint lister gennem features, og ved aktivering opretter listen et angivet sted. Man kan opnå samme effekt ved at lave en 'feature receiver', der opretter en liste ved aktivering af featuren, men dette eksempel vil vise den samme opnåelse uden en 'feature receiver'.

Først skal skemaet for listen defineres. Skemaet vil indholde definitioner på de forskellige kollonner samt deres type. Det nemmeste er helt klart at lave listen manuelt. Dvs. oprette listen på ens udviklingsmiljø, der hvor den skal placeres i produktion. Skemaet kan også skrives i hånden, men det er en del besværligt at gøre, så man sparer en masse tid ved at oprette listen, med alle de relevante felter (kollonner).

!Bemærk: Undgå navne med specielle tegn dvs. danske 'æ', 'ø' og 'å', erstat disse med henholdsvis 'ae', 'oe' og 'aa'. Når man opretter felterne første gang bliver deres første navn systemnavn og displaynavn. Dvs. at det første navn altid vil være et internt systemnavn og alle fremtidige omdøbninger vil kun blive rettet i displaynavet, der er det navn, der bliver vist. Har man stavet forkert, så slet listen og start forfra. Det vil spare for en masse problemer.

Er alle navnene blevet indtastet på felterne / kollonnerne, omdøb herefter da alle ord med danske 'ae', 'oe' og 'aa' til 'æ', 'ø' og 'å'. Dette vil medføre at displaynavnet vil stå rigtigt.

Åbn herefter SharePoint Manager 2007 eller SharePointManager 2010. Lokalisér sharepoint sitet og find frem til den oprettede liste og klik på 'Schema Xml' fanebladet. Her står skemaet for den oprettede liste. Kopier herefter indholdet af skemaet ind i en nyoprettet 'schema.xml' fil. Inde i 'schema.xml' filen kan der evt. refereres til tekst nøgler i *.resx (resource) filen. Flyt 'schema.xml' filen i fx. en mappe omdøbt til 'MySolutionName.MyFeatureName'. I denne mappe skal der nogle yderligere filer, som er ret faste samme med sharepoint lister. Disse filer kan derfor hentes her.
Placér disse filer sammen med 'schema.xml' filen i 'MySolutionName.MyFeatureName' mappen. Opret herefter endnu en xml fil i 'MySolutionName.MyFeatureName' mappen, som er navnet på featuren fx. 'MyFeatureNameList.xml'.

Mappen kommer til at se således ud:

SPList feature

I 'MySolutionName.MyFeatureName' skal skabelonen af listen placeres, og indholdet af 'MyFeatureNameList.xml' filen kan fx. se således ud:
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
    <ListInstance
           FeatureId="ee91fb59-a939-475c-9ca2-b8e6085b0684"
           Title="$Resources:MyCompany.MySolutionName.Portal, ListName_MyListName;"
           Description="$Resources:MyCompany.MySolutionName.Portal, ListDescription_MyListDescription;"
           Id="MyFeatureNameListe"
           TemplateType="100"
           Url="Lists/MySPListName">
    </ListInstance>          
</Elements>

Bemærk skabelon typen '100' er for 'Generic' type lister. En fuld liste af de forskellige List definitioner kan ses her. Under 'Url' angives placering for instansen af listen. Som man kan se i eksemplet, er der ligeledes angivet referencer til en resource. Indtast en evt. en klartekst for titlen og beskrivelsen af listen, hvis ikke en resource fil er tilrådighed med indholdende tekster.

Nu er skabelonen af listen på plads, og en ny mappe kaldet 'ListTemplates' oprettes side om side med 'MySolutionName.MyFeatureName' mappen. I samme omgang oprettes en 'feature.xml' og en 'elements.xml' fil.

Feature indhold

I 'feature.xml' filen vil defintionen på featuren angives:
<?xml version="1.0" encoding="utf-8"?>
<Feature  Id="ee91fb59-a939-475c-9ca2-b8e6085b0684"
          Title="$Resources:MyCompany.MySolutionName.Portal, ListName_MyListName;"
          Description="$Resources:MyCompany.MySolutionName.Portal, ListDescription_MyListDescription;"
          Version="1.0.0.0"
          Hidden="FALSE"
          Scope="Web"
          DefaultResourceFile="core"
          xmlns="http://schemas.microsoft.com/sharepoint/">
    <ElementManifests>
      <ElementManifest Location="ListTemplates\MyFeatureNameList.xml" />
      <ElementManifest Location="MySolutionName.MyFeatureName\MyFeatureNameList.xml"/>
    </ElementManifests>
</Feature>

Feature id er en GUID, som skal genereres for at sikre unik id. Denne feature GUID skal ligeledes angives i FeatureId i 'MyFeatureNameList.xml' filen. Den måde bindes instansen af listen til denne feature. Under '<ElementManifests>' angives lokationen til skabelon filen samt instans filen. Instans filen 'MySolutionName.MyFeatureName\MyFeatureNameList.xml' er allerede på plads.

I 'elements.xml' filen angives følgende:
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
    <ListInstance
           FeatureId="ee91fb59-a939-475c-9ca2-b8e6085b0684"
           Title="$Resources:MyCompany.MySolutionName.Portal,
ListName_MyListName;"
           Description="$Resources:
MyCompany.MySolutionName.Portal, ListDescription_MyListDescription;"
           Id="1036"
           TemplateType="100"
           Url="/Lists/
MySPListName">
    </ListInstance>          
</Elements>


Under 'ListTemplates' oprettes en ny 'MyFeatureNameList.xml' fil.
Indholdet af denne fil:
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <ListTemplate Name="MySolutionName.MyFeatureName" 
                Type="100"
                BaseType="0"
                OnQuickLaunch="TRUE"
                SecurityBits="14"
                Sequence="410"
                DisplayName="$Resources:MyCompany.MySolutionName.Portal.da-DK,ListName_MyListName;"
                Description="$Resources:MyCompany.MySolutionName.Portal, ListDescription_MyListDescription;"
                Image="/_layouts/images/itgen.gif">
    </ListTemplate>
</Elements>

Opret en mappe med et sigende navn på listen. I eksemplet er 'MyList' mappen anvendt jf. illustrationen. Kopier 'schema.xml' filen fra 'MySolutionName.MyFeatureName' ind i 'MyList' mappen. Hent de øvrige filer under 'MyList' mappen her.


Nu er featuren med en custom sharepoint liste klar, og skal blot pakketeres i en *.wsp fil. Der er flere måder at danne en *.wsp pakke fil på. Man kan enten skrive scriptet selv, eller benytte sig af wsp builder. For at benytte sig af wsp builder, skal denne addon være installeret i Visual Studio.

Strukturen i Visual Studio skal se således ud:

VS Struktur

I 'Resources' kan *.resx filerne med tekst nøglerne og teksten naturligvis placeres.
Hørjeklik herefter på projektet og vælg 'Build WSP'. En *.wsp fil vil herefter blive oprettet, og denne *.wsp pakke kan herefter deployeres på de relevante Sharepoint servere.
For at aktivere og instansiere featuren og listen, kan disse scripts med almindelige STSAdm kommandoer bruges.

Opret to bat filer med følgende navne:
'InstallMyFeature.bat'
'DeactivateRemoveMyFeature.bat'

'InstallMyFeature.bat' indholder følgende STSAdm kommandoer:
@echo on
set stsadm="C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\STSADM.EXE"

%stsadm% -o installfeature -name MySolutionName.MyFeatureName
%stsadm% -o activatefeature -name MySolutionName.MyFeatureName -url http://localhost -force

echo Finished installing and activating 'MyFeatureName' feature

pause
@echo on

'DeactivateRemoveMyFeature.bat' indholder følgende STSAdm kommandoer:
@echo off
set stsadm="C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\STSADM.EXE"

%stsadm% -o forcedeletelist -url "http://localhost/Lists/MySPListName"

echo Deactivating 'MySolutionName.MyFeatureName' feature...
%stsadm% -o deactivatefeature -filename "MySolutionName.MyFeatureName\feature.xml" -url "http://localhost" -force

echo Unistalling 'MyFeatureName' feature...
%stsadm% -o uninstallfeature -name "MySolutionName.MyFeatureName" -force

iisreset
pause
@echo on

Kør 'InstallMyFeature.bat' efter *.wsp pakken er udrullet på serveren. Åbn 'Central Administration' og kig under webfunktioner og bekræft at 'MyFeature' er installeret. Herefter kan Url'en på listen tastes ind og bekræftes at den er oprettet under aktivering af featuren efter afvikling af bat scriptet. Det andet script bruges til inaktivering samt oprydning, dvs. listen bliver slettet.

Hent de to *.bat scripts her.
Hent hele eksemplet her.