SharePoint für Entwickler (Teil 5)
Kommentare

Erreichbarkeit
Für den Administrator ist es aus vielerlei Gründen sinnvoll, Applikationen im Kontext einer Site Collection, Site oder eines Webs sichtbar oder unsichtbar zu machen. Mittels eines Features

Erreichbarkeit

Für den Administrator ist es aus vielerlei Gründen sinnvoll, Applikationen im Kontext einer Site Collection, Site oder eines Webs sichtbar oder unsichtbar zu machen. Mittels eines Features und dem passenden Featurereceiver können Sie die Navigation dynamisch anpassen. Das heißt, beim Aktivieren werden die Menüpunkt eingebaut und beim Deaktivieren wieder entfernt. Was bei SharePoint 2007 noch eine echte Insideraktion war, ist Dank der Projektvorlagen in Visual Studio 2010 jetzt deutlich einfacher. Im bereits angelegten Projekt öffnen Sie das Kontextmenü auf dem Eintrag des Features, wie in Abbildung 3 gezeigt.

Abb. 3: Einfügen eines Featurereceivers
Abb. 3: Einfügen eines Featurereceivers

Aber wo kommt die Navigation nun her? Es ist beispielsweise möglich, die Funktionen, die ASP.NET mitbringt, hier einzubringen. Der Code in Listing 4 zeigt, wie es geht. Die web.sitemap ist dazu als Ressource in die Assembly eingebunden und wird so Teil des Projekts.

public class Feature1EventReceiver : SPFeatureReceiver
{

  string PATH = @"/_layouts/";

  public override void FeatureActivated(
         SPFeatureReceiverProperties properties)
  {
    if (properties.Feature.Parent is SPSite)
    {
        // Falscher Scope
        return;
    }
    SPWeb web = (SPWeb)properties.Feature.Parent;
    SPNavigationNodeCollection topNavi = web.Navigation.TopNavigationBar;
    // Prüfe Top-Element
    CheckAndRemove(topNavi);
    // web.sitemap lesen (Namensraum ggf. anpassen)
    using (Stream st = GetType().Assembly.
           GetManifestResourceStream("ApplicationPage.web.sitemap"))
    {
       using (XmlReader tr = new XmlTextReader(st))
       {
          try
          {
            XElement siteMap = XElement.Load(tr);
            // Wurzelknoten hinzufügen ("Wurzel")
            var root = from r in siteMap.Descendants()      
                       where r.Attribute("title").
                       Value.Equals("Wurzel")
                       select r;
            // Gefunden
            if (root.Count() == 1)
            {
              XElement rootElement = root.First();
              string rootPath = web.Url + PATH;
              // Navigationsknoten einfügen
              SPNavigationNode rootNode = new SPNavigationNode(
               rootElement.Attribute("title").Value,
               rootPath + rootElement.Attribute("url").Value,
               true);
              SPNavigationNode topNode = topNavi.AddAsLast(rootNode);
              AddNodes(rootElement, topNode, rootPath);
            }
           }
           catch (Exception ex)
           {
           }
         }
       }
     }
     // weitere Knoten rekursiv einfügen
     private void AddNodes(XElement currentFrom, SPNavigationNode currentTo, 
                               string rootPath)
     {
        foreach (XElement r in currentFrom.Elements())
        {
           SPNavigationNode n = new SPNavigationNode(
                       r.Attribute("title").Value,
                       rootPath + r.Attribute("url").Value);
           SPNavigationNode newnode = currentTo.Children.AddAsLast(n);
           if (r.HasElements)
           {
              AddNodes(r, newnode, rootPath);
           }
        }
     }
     // Prüfen und ggf. entfernen
     private void CheckAndRemove(SPNavigationNodeCollection topNavi)
     {
        var nodes = from n in topNavi.Cast()
                    where n.Title.Equals("HR Department")
                    select n;
        if (nodes.Count() == 1)
        {
           topNavi.Delete(nodes.First());
        }
     }
     // Beim deaktivieren alle Knoten entfernen
     public override void FeatureDeactivating(
            SPFeatureReceiverProperties properties)
     {
        SPWeb web = (SPWeb)properties.Feature.Parent;
        SPNavigationNodeCollection topNavi = web.Navigation.TopNavigationBar;
        CheckAndRemove(topNavi);
     }
}  

Damit ist eigentlich alles gesagt. Die Vorlagen in Visual Studio 2010 erledigen lästige XML-Manipulation. Mit einer ASP.NET-Seite und durch die durch ein Feature aktivierte Navigation haben Sie alle Freiheiten, SharePoint als echte Programmierumgebung zu nutzen.

Fazit

Eine richtige Applikation, mit der Möglichkeit, die Daten mit Bordmitteln zu administrieren, entsteht auf der Basis von SharePoint innerhalb weniger Tage. Beherrschen Sie die Prinzipien, wie im Artikel gezeigt, und schauen auch mal nach Hilfsklassen wie SPUtilities, erreichen Sie eine nie zuvor dagewesene Produktivität. Die starke Infrastruktur, hohe Skalierbarkeit, umfassende Steuerelementbibliotheken und ein einheitliches Applikationsdesign sind starke Argumente. Das alles gab es bei SharePoint 2007 auch schon. Neu ist, dass Sie jetzt endlich richtig programmieren können.

Jörg Krause arbeitet als Fachautor, Trainer, Consultant und Softwareentwickler aus Leidenschaft. Schwerpunktthemen sind die Programmierung von Web- und Datenbankapplikationen mit .NET sowie SharePoint- und BizTalk-Programmierung. Zu vielen Themen hat er Bücher verfasst, darunter einige Bestseller (Apress, Hanser). Er arbeitet als Senior Consultant bei Computacenter AG & Co.oHG.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -