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

 

Nach langer Zeit habe ich die Domain http://www.guidschein.de wieder reaktiviert.
Wer also mal eine GUID benötigt… kann sich dort gerne eine erstellen lassen. Auch ein “Besitzschein” dieser GUID kann dort erstellt werden. Wem mal langweilig sein sollte, darf sich auch gerne daran versuchen eine von mir erstellte GUID zu erraten oder kann sich die zuletzt erstellten GUID’s anzeigen lassen Smiley

 

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.

 

Ich widme mich gerade speziell dem Thema “Hausautomation” und habe heute eine weitere pfiffige Möglichkeit herausgefunden, das Leben ein wenig zu vereinfachen.

Meine ersten FS20 Komponenten bestehend aus “Funk-Heizungssteuerung FHZ1000” (Wohnzimmer) und der Funk-Heizthermostat FHT 80B-II (Kinderzimmer) laufen bereits hervorragend. Als nächstes soll ein kleiner TabletPC mit der Software IP-Symcon die zentrale Steuerung aller Komponenten übernehmen.

Als ich damals die Bedienungsanleitung des Samsung UE46B8090 gelesen habe, bin ich auf das Home-Network-Center aufmerksam geworden, habe diese Information jedoch gleich wieder verworfen, da ich kein Samsung Handy besitze oder besitzen werde. Das Home-Network-Center bietet die Möglichkeit, Nachrichten (SMS), Anrufe oder Kalendereinträge anzuzeigen.

Dazu muss das Handy mit dem TV verbunden sein und diese Technik auch unterstützen. (z.B. SGH-i910-Omnia)

So nun aber genug der Vorgeschichte, was habe ich gemacht…

Zuerst habe ich mich auf der Seite SamyGo über die Schnittstelle informiert. Nach einigen Versuchen war dann meine kleine Testform auch schon fertig…

image

Nach der Eingabe der IP des TV kann mit der Auswahl ein Anruf simuliert werden, was auf dem TV so aussieht:

IMAG0239[1]

Auch eine SMS kann verschickt werden, wobei mich diese Option am meisten reizt. Hier ein beispielhafter Text, welcher durch die automatische Überwachung der Fenster realisiert werden könnte.

image

Das sieht dann am TV so aus:

IMAG0242[1]

Da ich noch auf der Suche nach einem geeigneten TabletPC (inkl. Windows) bin, wird es noch ein wenig dauern, bis ich IP-Symcon verwende und auch diese Automation nutzen kann. Die Möglichkeit des Nachrichten Push finde ich jedoch eine kleine elegante Lösung, um schnelle kurze Statusinformationen oder ähnliches visuell darzustellen.

Sobald ich was vernünftiges zusammengebastelt habe, wird es natürlich hier stehen Smiley

 

Als ich heute eine neue Solution für ein Visual Webpart erstellt habe musste ich leider feststellen, dass Visual Studio 2010 noch einen kleinen Bug beinhaltet.

Ich habe den Namespace geändert, jedoch wurde nach dem Deployment die Fehlermeldung “Webpart ist not registered as save” angezeigt, da als SafeControl Eintrag für die web.config immer noch die Endung “…mynamespace.VisualWebpart1” verwendet wurde.

Der Grund ist die *.spdata des Usercontrols, die nicht automatisch aktualisiert wird:

image

Der Assemblyname ist hierbei mit einer Variablen hinterlegt, der Namespace ist jedoch hart kodiert und wird nicht automatisch angepasst. Nach der manuellen Anpassung muss die Solution geschlossen, neu geöffnet und kompiliert werden. Im Anschluss daran kann ein neues Deployment oder auch Debugging erfolgen, dann funktioniert alles wie gewünscht.

 

Unter SharePoint 2010 ist es nun möglich, eigene Pages für bestimmte Events zu hinterlegen. Dies geht über die SPCustomPage Enumeration:

none  
AccessDenied Specifies AccessDenied.aspx.
Confirmation Specifies Confirmation.aspx.
Error Specifies Error.aspx.
Login Specifies Login.aspx.
RequestAccess Specifies ReqAcc.aspx.
Signout Specifies SignOut.aspx.
WebDeleted Specifies WebDeleted.aspx.

Die neue Page kann über ein Webapplication Feature per FeatureReceiver zugewiesen werden.

    const string ErrorPage = "/_layouts/CustomEventPages/error.aspx";
    public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
 
        SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
 
        if (webApp != null)
        {
            if (!webApp.UpdateMappedPage(SPWebApplication.SPCustomPage.Error, ErrorPage))
            {
                throw new Exception("Neue Fehlerseite konnte nicht registriert werden!");
            }
 
            webApp.Update(true);
        }
    }

Hierbei wird nun eine neue Errorpage gesetzt, die zusätzliche Informationen für den Anwender oder ein eigenes Layout beinhalten könnte.

 

Andreas M. hat einen Entwickler Tipp online gestellt, in dem er die Kommunikation zwischen den Settings und dem eigentlichen Add-In beschreibt. Benutzt wird hierbei ein einfacher Eventhandler, der beim Commit ausgelöst wird.

The easiest way to accomplish this is by using a singleton object which provides the necessary means of communication.

Now there’s two things left to do: First we need to subscribe to the ChangeNotifier’s Changed event in our console tab and second we have to call the Notify() method (which will fire the Changed event) from our settings tab when setting changes are committed.

image

Dieser Tipp kann benutzt werden, um Änderungen an den Einstellungen zu erkennen und im Add-In sofort zu reagieren.

Wenn ich an meine ganzen Versuche zurück denke… oje… der Weg ist einfach klasse!!

 

So meine letzte Tat vor dem Urlaub und auch vor dem geplanten Umzug war noch schnell eine kleine Seite zu erstellen.

Die Idee kam mir und einem Kollegen und war im groben sehr schnell realisiert. Es gibt hier und da noch einige offene Dinge zu erledigen, sei es Design oder der Benutzerfreundlichkeit aber sie ist jedenfalls erstmal LIVE :)

Das Konzept: generieren einer GUID (demnächst mit einem nicht ganz so ernst gemeinten GUID Besitzschein), gleichzeitig ein paar Tipps zu geben und ein kleines Ratespiel für die Minuten zwischendurch

Link:  http://www.guidschein.de

Das soll es dann erst einmal gewesen sein für dieses Jahr, nach dem Umzug geht es dann weiter mit dem Directory Watcher in der Version 1.1.

 

Tim Heuer hat eine 7-teilige Serie für einen erfolgreichen Beginn mit der Silverlight Entwicklung für Einsteiger verfasst.

Teil 1: Getting started – Tools and Hello World
Teil 2: Defining the UI layout and Navigation
Teil 3: Accessing Data
Teil 4: Binding the data and storing some for later
Teil 5: Integrating other controls
Teil 6: Polish the UI with Styles and Templates
Teil 7: Out-of-browser experiences

Sehr interessante Sachen dabei!!

 

Jeder kennt sie, die altbewährte MessagBox…

image

Um nach Fehlermeldungen zu suchen, tippt man sich hier oft die Finger in der Suchmaschine seines Vertrauens wund, denn Entwickler sind manchmal sehr gesprächig ;)

Dabei ist es so einfach… STRG + C zum kopieren der gesamten Meldung, klappt mit jeder MessageBox!

Hier einige Beispiele von lustigen Meldungen:

image

Roman

image

Ah ja und was wird nun übermittelt?

image

schade…

Nun ja, es gibt eine Vielzahl an lustigen Meldungen… Sonst wäre das Leben eines Entwicklers auch langweilig ;)

© 2012 Daniel Buschke - Blog Suffusion theme by Sayontan Sinha