In der ersten Jahreshälfte habe ich eine Artikelserie zu InfoPath 2007, Integration in SharePoint 2007 und MOSS Forms Services begonnen (Teil 1, Teil2). Leider fehlte mir die Zeit, das Thema Entwicklung von InfoPath Formularen zu vertiefen, was ich aber hiermit nachholen möchte. Heute werde beschreiben, wie ein InfoPath-Formular mit Managed Code erweitert und als browserbasiert bereitgestellt werden kann. Als Entwicklungswerkzeuge können Visual Studio for Applications (VSTA) oder Visual Studio Tools for Office (VSTO) genutzt werden. Da VSTA in Office 2007 integriert ist, werde ich diese Entwicklungsumgebung als Basis für die Programmierung verwenden.
1. Visual Studio for Applications installieren
VSTA ist standardmäßig nicht installiert und muss zusätzlich für InfoPath registriert werden. (In den Softwarekomponenten) > Office 2007 (Enterprise / Ultimate) anpassen > Features hinzufügen oder entfernen > Microsoft Office und dann die Visual Studio-Tools für Anwendungen aktivieren.
2. Formular um Code erweitern
Hinweis: Wie Formulare entworfen und für die InfoPath Forms Services konfiguriert werden, wird in Teil 2 beschrieben.
Jetzt kann das Formular mit Code gefüttert werden. Zunächst muss in den Formulareinstellungen die gewünschte Programmiersprache und der Projektspeicherort ausgewählt werden. Extras > Formularoptionen > Programmierung
Browserfähige Formular können über die .NET Programmiersprachen C# oder VB.NET entwickelt werden.
Nachdem die vorbereitenden Aufgaben erledigt sind, kann das Formular mit Programmiercode erweitert werden. Über Extras > Programmierung stellt InfoPath verschiedene kontextbasierte Events bereit.
Zum Beispiel kann das Loading-Ereignis dazu genutzt werden, Programmcode beim Öffnen eines neuen Formulars auszuführen. Nach Auswahl einer Ereignisvorlage wird von VSTA das Event und der dazugehörige Event Handler im Code automatisch erzeugt.
public void InternalStartup()
{
EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading);
}
public void FormEvents_Loading(object sender, LoadingEventArgs e)
{
}
Neben den Formularereignissen können auch Steuerelemente durch Event-Handler erweitert werden. Je nach Typ des Controls stehen verschiedene Ereignistypen zur Auswahl.
Zum Beispiel können für Textboxen oder DropDown-Listen Event Handler für das Validating- oder Changed-Ereignisse registriert werden. Natürlich kann auch das Click Event eines Buttons abgefangen werden.
Innerhalb des Codes sind jetzt keine Grenzen mehr gesetzt, da die komplette Funktionsbreite des .NET Frameworts zur Verfügung steht. Klassische Anwendungsfälle sind der Zugriff auf Backend-Daten, die Initiierung von zusätzlichen Prozessen oder auch die manuelle Speicherung der Daten in einer SharePoint-Applikation. Auch die Manipulierung des Formulars selbst kann innerhalb des Programmcodes durchgeführt werden. Da ein InfoPath-Formular nichts weiter als ein XML-Dokument ist, können für diese Aufgabe Klassen aus dem Namensraum System.Xml genutzt werden. Folgender Code soll den Zugriff auf ein Element des Formulars veranschaulichen:
public void InternalStartup()
{
EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading);
((ButtonEvent)EventManager.ControlEvents["btnSend"]).Clicked += new ClickedEventHandler(btnSend_Clicked);
}
public void FormEvents_Loading(object sender, LoadingEventArgs e)
{
XPathNavigator xNavRoot = this.CreateNavigator();
XPathNavigator xNavDate = xNavRoot.SelectSingleNode("my:urlaubsantrag/my:begin", this.NamespaceManager);
xNavDate.SetValue(DateTime.Now.AddDays(1).ToShortDateString());
}
Über die Methode CreateNavigator kann aus dem XML-Baum des Dokuments ein XPathNavigator-Objekt erzeugt werden. Dieses Objekt stellt verschiedenen Möglichkeiten bereit, zu den Elemente innerhalb des Baums zu navigieren. In meinem Beispiel erzeuge ich einen neuen XPathNavigator über die SelectSingleNode-Methode . Die Methode erwartet einen XPath-Ausdruck und den Namespace des Dokuments. Keine Angst, der XPath-Pfad muss nicht immer mühsam eingetippt werden. Einfach in den Datenquelle das gewünschte Element auswählen, „XPath kopieren“ und in die Methode einsetzen.
Über die SetValue-Methode kann dann der Wert des Elements gesetzt werden. An dieser Stelle möchte ich auch die Programmierung verlassen und zur Veröffentlichung übergehen. Es gibt zum Thema Entwicklung von InfoPath-Formularen zahlreiche Bücher und Artikel, auf die ich an dieser Stelle verweisen möchte.
3. Formular veröffentlichen
Bevor das Formular veröffentlicht wird, sollte noch einmal geprüft werden, ob es browserkompatibel ist und mindestens die Vertrauensstufe Domäne aufweist. Über das Menü Datei > Veröffentlichen kann dann der Veröffentlichungsprozess initiiert werden. Danach öffnet nicht ein Assistent. Im ersten Schritt wird der SharePoint-Server als Veröffentlichungsziel.
Danach muss die URL der Site Collection eingetragen werden, in die das Formular später webbasiert bereitgestellt werden soll. Mit dieser URL wird geprüft, ob die Site Collection alle erforderlichen Features enthält. Im Anschluss erscheint der Bereich für die Auswahl der Dokumentenbibliothek oder des Content Types. Hier wird auch schon der erste Unterschied zu nicht Code-basierten Formularen deutlich. InfoPath-Formulare mit Code können nicht direkt auf eine Dokumentenbibliothek oder einen Content Type veröffentlicht werden. Stattdessen steht die Option zur Auswahl, ein vom Administrator zu genehmigendes Formular zu veröffentlichen, was nichts weiter bedeute als dass es über die Zentraladministration zu einem späteren Zeitpunkt registriert werden muss.
Der nächste Schritt verlangt die Auswahl des lokalen Verzeichnisses, in das das Formular gespeichert werden soll. Zum Schluss können noch die zu veröffentlichen Eigenschaften ausgewählt werden, wonach der Assistent fertig gestellt werden kann.
5. Formular hochladen und aktivieren
Das veröffentlichte Formular kann nun in der SharePoint-Farm registriert und für die Site Collection aktiviert werden. Diese Aufgabe kann über die Zentraladministration oder über STSADM durchgeführt. In der Zentraladministration kann das zuvor veröffentlichte Formular über Application Management > (InfoPath Forms Services) > Upload form template hochgeladen werden.
Nachdem das Formular erfolgreich hochgeladen wurde, erscheint es in der Liste der Form Templates. Über das Kontextmenü des neuen Eintrags kann das Formular nun für eine Site Collection aktiviert werden.
Was bedeutet jedoch „aktivieren“? Mit der Aktivierung eines Formulars werden eine Reihe von Arbeitsschritten im Hintergrund durchgeführt: Aus dem XNS-Dokument wird eine SharePoint Solution generiert, die ein Feature mit der InfoPath Vorlage und der .NET Assembly enthält.
Die Solution wird dann in der SharePoint Farm automatisch deployt und das Feature in der ausgewählten Site Collection aktiviert. Mit der Aktivierung des Features wird das Form Template in die interne Bibliothek FormServerTemplates kopiert.
Nachdem der Aktivierungsprozess beendet ist, kann die interne URL zur Formularvorlage genutzt werden, im das Formular browserbasiert aufzurufen. Zum Beispiel
http://servername/_layouts/formserver.aspx?xsnlocation=/formservertemplates/urlaubsantrag.xsn&openin=browser
Wie man vielleicht sieht, haben browserbasierte Formulare einen Nachteil: Sie werden in einem leeren Browserfenster gerendert, wodurch der komplette Kontext der Webseite verloren geht. Der eine oder andere wird evtl. die Anforderung haben, dieses Formular als Webpart in seine Site Collection zu integrieren. Wie das funktioniert, werde ich im letzten Artikel dieser Serie beantworten.
Bereitgestellt
18 Nov 2007 12:17
von
Fabian Moritz