Mich traf die Aufgabe, in einer Bibliothek die Ordnersymbole anders zu gestalten, je nachdem ob sich Dateien innerhalb dieses Ordners befinden oder eben nicht.
Die Lösung ist relativ simpel und mit ein bisschen Javascript und dem Client Object Model des SharePoint Servers relativ schnell gelöst gewesen.

Ziel war es, in Dokumentenmappen die Ordner (welche dort eh nicht supported sind) ein anderes Symbol zu geben. Da die Dokumentenmappen allesamt dieselbe Seite nutzen (docsethomepage.aspx), habe ich eine Javascript Datei geschrieben, welche auch direkt in der Seite über ein Inhaltseditor Webpart geladen wird. Natürlich wäre auch ein Link in der Masterpage möglich gewesen, aber dieser Weg schien am einfachsten.

Ok was wird benötigt.. zuerst mal habe ich aus dem Ordner “14\Template\Images” das Bild für den Ordner (Folder.gif) kopiert und nach meinen Wünschen angepasst. Diese Datei wurde dann im selben Verzeichnis unter dem Namen “FolderFiles.gif” gespeichert.

Im Anschluss daran habe ich mir die unter der MIT Lizenz stehende Javascript Datei “getelementsbyclassname” heruntergeladen und im Ordner “14\Template\Layouts\scripts” gespeichert.

Nun konnte ich mit der eigentlichen Entwicklung beginnen. Zuerst habe ich mir eine neue Javascript Datei im gleichen Ordner erstellt und dann ging’s los…

ExecuteOrDelayUntilScriptLoaded(initialize, "sp.js");

Das wichtigste zuerst! Diese Funktion wartet, bis das Client Object Model (die Datei “sp.js”) vollständig geladen ist und ruft anschließend die Funktion “initialize” auf.

 

function initialize() {
    //Alle Ordner anhand der Klasse "ms-vb-icon" finden
    var folders = getElementsByClassName("ms-vb-icon");
    if (folders.length > 0) {
 
        var rf = "RootFolder=";
 
        for (var i = 0; i > folders.length; i++) {
            //Startposition ermitteln
            var startPos = folders[i].firstChild.search.indexOf(rf) + rf.length;
            //Endeposition ermitteln
            var endPos = folders[i].firstChild.search.indexOf("&", folders[i].firstChild.search.indexOf(rf) + rf.length + 1);
            //URL Teilstring auslesen
            var listUrl = folders[i].firstChild.search.substr(startPos, endPos - startPos);
            //Dekodieren der Sonderzeichen in der URL
            listUrl = decodeURIComponent(listUrl);
 
            //Image Objekt des Ordners
            var img = folders[i].firstChild.firstChild;
            //Funktion aufrufen, welche die Anzahl der Dateien ermittelt
            GetItemCount(listUrl, img);
        }
    }
}

Diese Funktion sollte sich anhand der Kommentare selbst erklären, also gehen wir über zur zweiten Funktion…

 

function GetItemCount(folder, img) {
    var folderUrl = folder;
 
    var ctx = new SP.ClientContext.get_current();
    var web = ctx.get_web();
    ctx.load(web);
    var folder = web.getFolderByServerRelativeUrl(folderUrl);
    ctx.load(folder);
    ctx.executeQueryAsync(
      function (s, a) {
          if (folder.get_itemCount() > 0) {
              img.src = "/_layouts/images/FolderFiles.gif";
          }
      });
}

Die Funktion GetItemCount ruft über den aktuellen Kontext die Ordner ab und ermittelt anschließend die Anzahl an Dateien. Anschließend wird das Ordnersymbol getauscht, wenn mindestens eine Datei im Ordner enthalten ist.

Das war's... einfach aber sicherlich ganz komfortabel, da nicht in jedem Ordner hineingeschaut werden muss.

Und so sieht dann das Endergebnis aus:

FolderFiles

 

Für eingefleischte Entwickler sicherlich bekannt, für Neulinge allerdings eine Hilfestellung bei der Installation von SharePoint Solutions (Webparts, Workflows, Eventhandler, usw…). Der Installer prüft bei der Ausführung, ob die Umgebung alle notwendigen Voraussetzungen erfüllt und installiert die Solution im SharePoint. Anschließend bleibt dann z.B. nur noch das Feature zu aktivieren, Webpart auf der Seite platzieren…

Das Tool ist kostenlos und kann von Codeplex heruntergeladen werden. Die momentane Version ist noch für den SharePoint 2007 (MOSS), allerdings ist der Quellcode frei verfügbar und es sind nicht viele Stellen die abgeändert werden müssen um das Setup auch für den SharePoint 2010 “fit” zu machen.

Danach steht der einfachen Installation von Solutions nichts mehr im Wege.

Der Installer besteht im besten Fall aus 4 Dateien, die auf den Server kopiert werden müssen:

setup.exe
setup.exe.config
logo.png
solution.wsp

Die ersten drei Dateien sind der Hauptbestandteil des Installers. Die Setup.exe ist der normale Installer und wird mit einem Doppelklick ausgeführt. Die zweite Datei (setup.exe.config) dient zur Konfiguration. Die dritte Datei ist optional, damit kann im Installer das Firmenlogo angezeigt werden. Die vierte Datei ist das Paket, welches im SharePoint bekannt gemacht werden soll, also euer Webpart, Workflow oder ähnliches. Da bietet der SharePoint Server zu viele Möglichkeiten um hier alle einzeln aufzulisten.

In der Konfigurationsdatei sind einige wenige Einstellungen vorzunehmen:

  • SolutionID
  • Name der WSP Datei
  • Titel des Setups

Der Rest kann im Normalfall so belassen werden (Ausnahmen bestätigen die Regel).
Für unsere Firma habe ich den Quellcode in 1 Stunde angepasst. Es ist also nicht wirklich schwer auch für den SharePoint Server 2010 Solutions professionell zu verteilen.

 

Jeder der Features, Site- und/oder Listdefinitions, Webparts oder Workflows entwickelt, benötigt gewisse Grundkenntnisse über ID's bzw. Typen, welche das entsprechende Template oder den Datentyp wiederspiegelt.

Eine ausführliche Auflistung von SPBaseType bis hin zu TemplateNames ist zu finden unter http://abstractspaces.wordpress.com/2008/08/01/sharepoint-reference-sheet/

 

Heute hatte ich mit 2 Fehlermeldungen zu kämpfen, welche nicht wirklich aussagekräftig daher kommen. Zum Problem: Ich habe eine Masterpage, welche normal per Upload in der Masterpage Gallery hinterlegt ist (Upload).

Diese wollte ich auf Feature umstellen, da Änderungen für alle Sitecollections einfach zu komplex sind (Upload, CheckIn, Publish, Approve)

Also nahm ich die Masterpage und bastelte ein kleines Feature. Bis dahin alles problemlos. Jedoch musste die alte Datei ja erst einmal aus der Gallerie verschwinden.... Also "Delete" geklickt und ich erhlate die Fehlermeldung "This item cannot be deleted because it is still referenced by other pages"

Nach kurzer Recherche fand ich einen Tip bei Katrien
Einfach einen neuen Ordner erstellen, Datei per SPD oder Windows Explorer in diesen kopieren und den Ordner anschließend löschen.

Das wars, Problem behoben und ich konnte endlich die neue Datei über Feature nutzen.

 

Eigene Features zu erstellen ist gar nicht schwer. :)

Ein paar Beispiele für das SiteAction Menü gibt's hier:
SiteAction Menü
SiteAction Menü mit sämtlichen SettingsMenüs

eine wirklich detaillierte Beschreibung zur Erstellung eines Features <--> DocLib befindet sich auf Tod Baginski's Blog unter http://www.sharepointblogs.com/tbaginski

ein Video mit dem kompletten Aufbau gibts hier: http://channel9.msdn.com/ShowPost.aspx?PostID=197643
(detaillierter Aufbau des Features und CodeBehind zum überprüfen, wann das Feature aktiviert ist)
Video ca 30 min

 

 

Im Blog unter sharepoint-dms.com gibt es 6 Posts, die die Erstellung von Websitespalten, Inhaltstypen und List- bzw. Bibliotheks-Definitionen per Feature aufzeigen

Teil 1: Eigene List- und Bibliotheksdefinitionen erstellen
Teil 2: Websitespalten per Feature erzeugen
Teil 3: Inhaltstypen per Feature erzeugen
Teil 4: Inhaltstyp an eine Liste oder Bibliothek binden
Teil 5: Ressource Dateien in Feature's verwenden
Teil 6: Feature Verzeichnis strukturieren

 

 

Libs FeatureId ListTemplate
Document Library {00bfea71-e717-4e80-aa17-d0c71b360101} 101
Form Library {00bfea71-1e1d-4562-b56a-f05371bb0115} 115
Wiki Page Library {00bfea71-c796-4402-9f2f-0eb9a6e71b18} 119
Picture Library {00bfea71-52d4-45b3-b544-b1c71b620109} 109
Report Library {2510d73f-7109-4ccc-8a1c-314894deeb3a} 433
Translation Management Library {29d85c25-170c-4df9-a641-12db0b9d4130} 1300
Data Connection Library {00bfea71-dbd7-4f72-b8cb-da7ac0440130} 130
Slide Library {0be49fe9-9bc9-409d-abf9-702753bd878d} 2100
 
Communications FeatureId ListTemplate
Announcements {00bfea71-d1ce-42de-9c63-a44004ce0104} 104
Contacts {00bfea71-7e6d-4186-9ba8-c047ac750105} 105
Discussion Board {00bfea71-6a49-43fa-b535-d15c05500108} 108
 
Tracking FeatureId ListTemplate
Links {00bfea71-2062-426c-90bf-714c59600103} 103
Calendar {00bfea71-ec85-4903-972d-ebe475780106} 106
Tasks {00bfea71-a83e-497e-9ba0-7a5c597d0107} 107
Project Tasks {00bfea71-513d-4ca0-96c2-6a47775c0119} 150
Issue Tracking {00bfea71-5932-4f9c-ad71-1557e5751100} 1100
Survey {00bfea71-eb8a-40b1-80c7-506be7590102} 102
 
Custom Lists FeatureId ListTemplate
Custom List {00bfea71-de22-43b2-a848-c05709900100} 100
Custom List in Datasheet View {00bfea71-3a1d-41d3-a0ee-651d11570120} 120
Languages and Translators {29d85c25-170c-4df9-a641-12db0b9d4130} 1301
KPI List {065c78be-5231-477e-a972-14177cc5b3c7} 432
© 2012 Daniel Buschke - Blog Suffusion theme by Sayontan Sinha