>Toevoegen en wijzigen van content types via code

>

Laatst hadden we besloten om onze aankondigingen op sharepoint wat te stroomlijnen. In het oude systeem kwamen alle items van het type “aankondiging” (announcement) via een CQWP op de homepage te staan. Dit was niet meer de bedoeling.

We hebben nu 2 content types aangemaakt die overerven van het type ‘”aankondiging”. De 2 extra types moesten nu nog toegevoegd worden aan elke list waar het contenttype aankondiging bestond, alle bestaande items moesten worden aangepast naar het nieuwe standaard content type én het oorspronkelijke contenttype “aankondiging” moest worden verwijderd uit de lijst.

Veel om dit allemaal manueel te doen dus heb ik hiervoor een programma geschreven.

   10         Try

   11             Console.Write("Geef de url van de website: ")

   12             Dim url As String = Console.ReadLine()

   13 

   14            

   15 

   16             Using site As New SPSite(url)

   17                 Dim website As SPWeb = site.OpenWeb

   18                 Dim announcementLists As New List(Of SPList)

   19 

   20                 announcementLists.AddRange(GetAnnouncementLists(website))

   21 

   22                 For Each l As SPList In announcementLists

   23                     Console.WriteLine("List: {0} {1}", l.Title, l.DefaultViewUrl)

   24 

   25                     If Not ListContainsContentType(CONTENTTYPE_Algemeen, l) Then

   26                         ‘contenttype toevoegen

   27                         Console.WriteLine("     ContentType {0} toevoegen aan {1}", CONTENTTYPE_Algemeen, l.Title)

   28                         AddContentTypeToList(CONTENTTYPE_Algemeen, l, website)

   29                     Else

   30                         Console.WriteLine("     List {0} already contains contenttype {1}", l.Title, CONTENTTYPE_Algemeen)

   31                     End If

   32 

   33                     If Not ListContainsContentType(CONTENTTYPE_Werkgroep, l) Then

   34                         ‘contenttype toevoegen

   35                         Console.WriteLine("     ContentType {0} toevoegen aan {1}", CONTENTTYPE_Werkgroep, l.Title)

   36                         AddContentTypeToList(CONTENTTYPE_Werkgroep, l, website)

   37                     Else

   38                         Console.WriteLine("     List {0} already contains contenttype {1}", l.Title, CONTENTTYPE_Werkgroep)

   39                     End If

   40 

   41                     SetItemsToNewContentType(CONTENTTYPE_Werkgroep, l, website)

   42 

   43                     Try

   44                         RemoveContentTypeFromList("Aankondiging", l)

   45                     Catch ex As Exception

   46                         Console.WriteLine("ERROR: {0}", ex.Message)

   47                     End Try

   48                 Next

   49                 website.Dispose()

   50                 site.Dispose()

   51             End Using

   52         Catch ex As Exception

   53             Console.ForegroundColor = ConsoleColor.Red

   54             Console.WriteLine(ex.ToString)

   55             Console.ResetColor()

   56         Finally

   57             Console.WriteLine("Druk op enter om te stoppen")

   58             Console.ReadKey()

   59         End Try

Het programma gaat alle lijsten ophalen van het type “aankondiging”. Dit gaat via een recursieve functie.

   62     Private Function GetAnnouncementLists(ByVal web As SPWeb) As List(Of SPList)

   63         Dim lists As New List(Of SPList)

   64 

   65         For Each lst As SPList In web.Lists

   66             Dim ListContainsAnnouncementContentType As Boolean

   67             For Each ct As SPContentType In lst.ContentTypes

   68                 If ct.Name = "Aankondiging" Then

   69                     ListContainsAnnouncementContentType = True

   70                     Exit For

   71                 Else : ListContainsAnnouncementContentType = False

   72                 End If

   73             Next

   74 

   75             If ListContainsAnnouncementContentType Then

   76                 lists.Add(lst)

   77             End If

   78 

   79         Next

   80 

   81         If web.Webs.Count > 0 Then

   82             For Each subSite As SPWeb In web.Webs

   83                 lists.AddRange(GetAnnouncementLists(subSite))

   84             Next

   85         End If

   86 

   87         Return lists

   88 

   89     End Function

We controleren elke lijst of het content type reeds aanwezig is of niet:

   91     Private Function ListContainsContentType(ByVal contentTypeName As String, ByVal list As SPList) As Boolean

   92 

   93         For Each ct As SPContentType In list.ContentTypes

   94             If ct.Name = contentTypeName Then Return True

   95         Next

   96 

   97         Return False

   98     End Function

Wanneer het content type niet aanwezig is wordt het toegevoegd:

  100     Private Sub AddContentTypeToList(ByVal contentTypeName As String, ByVal list As SPList, ByVal rootWeb As SPWeb)

  101         ‘contenttype ophalen

  102         Dim contentType As SPContentType = rootWeb.ContentTypes(contentTypeName)

  103         If Not contentType Is Nothing Then

  104             list.ContentTypes.Add(contentType) ‘contenttype toevoegen

  105             list.Update()

  106         End If

  107 

  108     End Sub

Vervolgens migreren we de bestaande items naar het nieuwe default content type:

  110     Private Sub SetItemsToNewContentType(ByVal newContentTypeName As String, ByVal list As SPList, ByVal rootWeb As SPWeb)

  111         ‘content type ophalen

  112         Dim contentType As SPContentType = list.ContentTypes.Item(newContentTypeName)

  113 

  114         For i As Integer = 0 To list.Items.Count – 1

  115             Dim listItem As SPListItem = list.Items(i)

  116 

  117             If listItem("ContentTypeId") <> contentType.Id Then

  118                 listItem("ContentTypeId") = contentType.Id

  119                 listItem.Update()

  120                 Console.WriteLine("Updated content type for item {0}", listItem.Title)

  121             End If

  122             list.Update()

  123         Next

  124     End Sub

En op het einde verwijderen we het oude content type:

  126     Private Sub RemoveContentTypeFromList(ByVal contentTypeName As String, ByVal list As SPList)

  127         list.ContentTypesEnabled = True ‘zorgen dat je de contenttypes kan selecteren

  128         list.Update()

  129         Dim ctToRemove As SPContentType = list.ContentTypes.Item(contentTypeName)

  130         If Not ctToRemove Is Nothing Then

  131             list.ContentTypes.Delete(ctToRemove.Id) ‘het "oude" contenttype verwijderen uit de lijst

  132         End If

  133     End Sub