Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Sharepoint 2007: Ordner in Listen und Bibliotheken entmystifiziert

Die letz­ten Tage habe ich damit ver­bracht, mich mit den Besonderheiten(oder bes­ser absur­den Angewohnheiten) von Sharepoint 2007  zu befas­sen. Speziell mit dem pro­gram­ma­ti­schen Anlegen von Ordnern und Unterordnern in Sharepoint Dokumenten – Bibliotheken bezie­hungs­weise Listen.

Hier meine gesam­mel­ten Erfahrungen über das Anlegen von Ordnern in

  • Bild- und Dokumentenbibliotheken (Picture- and Documentlibrary)
  • Webseiten Bibliotheken (Pages Library)
  • Wiederverwendbare Inhalte (Reusable Content)

Bild- und Dokumentenbibliotheken (Picture- and Documentlibrary)

Angefangen hat das ganze mit dem Versuch, Unterordner in einer Bild- und Dokumentenbibliothek anzu­le­gen. Hier stellte sich Sharepoint gut­mü­tig. Innerhalb die­ser Bibliotheken kann über das Menü (Neu /New) ein Ordner ange­legt wer­den, in wel­chen spä­ter auch Inhalte gespei­chert wer­den kön­nen.
Soll das Anlegen der Ordner pro­gram­ma­tisch (zum Beispiel über ein Feature) erfol­gen,  kann fol­gen­der Programmcode ver­wen­det wer­den.

String folderList = "Bilder";
SPList spList = webContext.Lists[folderList];
String folderUrl = spList.RootFolder.ServerRelativeUrl.ToString();
SPFolderCollection foldersColl = web.GetFolder(folderUrl).SubFolders;
SPFolder newFolder = folders.Add("Unterordner");
spList.Update();

Bis hier­her könnte man mei­nen, Sharepoint bie­tet dem Entwickler mit sei­ner API alle Möglichkeiten, Listen zu modi­fi­zie­ren und so zum Beispiel Ordner anzu­le­gen.

Webseiten Bibliotheken (Pages Library)

Ich wurde jedoch eines Besseren belehrt, als ich ver­suchte, inner­halb der Webseiten Bibliothek (Pages Library) einen Unterordner anzu­le­gen. Anders als in einer Bildbibliothek bie­tet hier das Menü nicht die Möglichkeit, einen Ordner hin­zu­zu­fü­gen.

Pagesfolder

Da das Menü fehlte, dachte ich mir, ver­su­che ich es doch ein­fach per Programmcode. Hierzu kann der obige Code ver­wen­det wer­den, indem ein­fach der String für die Liste auf Pages geän­dert wird.

String folderList = "Pages";

Pagestest

Das Ergebnis sieht wie oben ange­zeigt aus. Der Unterordner erscheint unter­halb der Webseiten Bibiliothek. Eigentlich das gewünschte Ergebnis … aber die­ses Ergbnis hat einen Haken. Unterhalb die­ses Ordners kön­nen keine Pages ange­legt wer­den und der Unterordner hat auch kei­nen Menüpunkt inner­halb der GUI für das Anlegen einer Page.

Nach inten­si­ver Recherche fand ich einen Knowledge Article von Microsoft zu die­sem Thema.

http://support.microsoft.com/kb/948614/en-us
Daraus geht klar her­vor, dass die­ses Verhalten von Microsoft nicht unter­stützt wird. Schade eigent­lich.

Wiederverwendbare Inhalte (Reusable Content)

Der letzte Schritt sollte das Anlegen eines Unterordners unter­halb der Wiederverwendbaren Inhalte Bibliothek (Reusable Content) dar­stel­len.  Da das Menü die Möglichkeit bie­tet, bequem einen Unterordner in die­ser Liste zu erstel­len, dachte ich, der Programmcode von oben sollte sehr gut dafür funk­tio­nie­ren … weit gefehlt. Wieder wurde ich eines Besseren belehrt. Der Code bewirkte in die­ser Liste rein gar nix.

Nach einer Phase des Debuggens wurde mir klar, wie Sharepoint hier arbei­tet. Anstatt einen SPFolder anzu­le­gen, muss hier ein ein neues SPListItem ange­legt wer­den. Der Trick an der Sache ist, die­sem SPListItem den glei­chen SPContentType zuzu­wei­sen wie Sharepoint ihn ver­wen­det, um einen Ordner anzu­le­gen.

Wir benö­ti­gen den ContentType für Folder. Wird die­ser ContentType einen SPListItem zuge­wie­sen, erscheint die­ses danach auch in der Wiederverwendbaren Inhalte Liste als Ordner und besitzt alle nöti­gen Menüpunkte. Der pas­sende SPContentType kann wie folgt ermit­telt wer­den:


SPContentTypeId contentId = new SPContentTypeId("0x0120");
SPContentTypeId listCTID = reuseList.ContentTypes.BestMatch(contentId);
SPContentType cType = reuseList.ContentTypes[listCTID];
List contentTypes = new List();
contentTypes.Add(cType);

Das Ganze habe ich anschlie­ßend in eine gene­ri­sche Methode ver­packt, wel­che wie folgt aus­sieht:

CodeSnippet
Diese Methode legt nun ein SPListItem an, wel­ches den Content Type Folder besitzt und auch ent­spre­chend in der Liste ange­zeigt wird. Da der Ordner im Verzeichnisbaum jedoch nicht der­selbe ist wie in der Liste ange­zeigt, muss  die­ser noch umbe­nannt wer­den.  Anschließend kann die­ser Ordner genauso ver­wen­det wer­den, als ob er über das gra­fi­sche Menü ange­legt wor­den wäre. War doch ganz ein­fach… – oder?
Zum bes­se­ren Kopieren hier das Ganze noch­mal als Text:

internal static void SubFolder2ReusableList(SPList reuseList, string reusableFolder)
 {
 reuseList.ContentTypesEnabled = true;
 //get the content type for the folder
 SPContentTypeId contentId = new SPContentTypeId("0x0120");
 SPContentTypeId listCTID = reuseList.ContentTypes.BestMatch(contentId);
 SPContentType cType = reuseList.ContentTypes[listCTID];
 List<SPContentType> contentTypes = new List<SPContentType>();
 contentTypes.Add(cType);

 SPListItem newListItem = reuseList.Items.Add();

 newListItem[SPBuiltInFieldId.ContentTypeId] = cType.Id;
 newListItem[SPBuiltInFieldId.Title] = reusableFolder + "_tmp";
 newListItem.Update();
 reuseList.Update();

 //get the parent folder of the SPListItem which is resident in the left tree
 //its not the same folder as listed in die detail list on the right
 using (SPWeb webContext = reuseList.ParentWeb)
 {
 SPFolder reuseFolder = webContext.GetFolder(newListItem.Url);
 try
 {
 //try to rename the folder on the left
 reuseFolder.MoveTo(reuseList.RootFolder.ServerRelativeUrl + "/" + reusableFolder);
 }
 catch (SPException)
 {
 //if the folder already exist delete it
 SPFolder toDeleteFolder = webContext.GetFolder(reuseList.RootFolder.ServerRelativeUrl + "/" + reusableFolder);
 toDeleteFolder.Delete();
 reuseFolder.MoveTo(reuseList.RootFolder.ServerRelativeUrl + "/" + reusableFolder);

 }
 //rename the _tmp SPListitem to his final name
 newListItem[SPBuiltInFieldId.Title] = reusableFolder;
 newListItem.Update();
 }
 }

Related Posts

1 Kommentar

Sharepoint 2007: Ordner in Listen und Bibliotheken ent­mys­ti­fi­ziert @Communardo #Techblog http://bit.ly/jQ1MV
This com­ment was ori­gi­nally pos­ted on Twitter

Comments are closed.

Pin It on Pinterest