Es ist möglich Edit, New und Display Formulare mit einer App erstellen und vom Hostweb aus aufzurufen. Die Vorgangsweise ist simpel, muss aber komplett im Sourcecode formuliert werden. Die einzige Herausforderung ist es, die URL zum HostWeb zu ermitteln.
1) ContentType im HostWeb anlegen
2) dem ContentType dieUrl zum NewForm hinterlegen:
1 AddNewFormToContentType(ct: SP.ContentType, formUrl: string): P.Promise<boolean> {
2 var deferred: P.Deferred<boolean> = P.defer<boolean>();
3 ct.set_newFormUrl(formUrl);
4 ct.update(true);
5 SPContextHelper.AppCTX().executeQueryAsync(
6 () => { deferred.resolve(true); },
7 (sender, args) => { deferred.reject({ message : args.get_message()}); }
8 );
9 return deferred.promise();
10 }
In Zeile 3 wird die URL zugewiesen. Wenn im Ordner “Pages” der App die Seite angelegt wurde kann die Url so aussehen: "~site/RemoteProvisioningDemo/Pages/NewForm.aspx"
3) im Host Web eine Liste anlegen die den Content-Type zugewiesen bekommt.
bis hierher ist alles ohne größere Probleme zu meistern. Jetzt muss nur noch das NewForm implementiert werden.
4) im Newform muss der Code zum Anlegen des neuen Listitem erstellt werden. bzw im Edit der Code zum Aktualisieren.
An dieser Stelle muss auf die Liste im HostWeb zugegriffen werden. (siehe meine Artikel dazu). Und hierfür muss die URL des Hostwebs bekannt sein.
Leider wird dieser Parameter beim Aufruf des NewForms nicht übergeben. Ein Blick in die Aufruf URL zeigt was übergeben wird:
1 http://app-ddc06de897e232.spdev2apps.grobl.local/sites/Dev/RemoteProvisioningDemo/Pages/NewForm.aspx?
2 List=6994a46b-7f63-40a8-b5ee-0ebd6df5afac
3 &Source=http://spdev2/sites/Dev/Lists/ppStandorte/AllItems.aspx
4 &ContentTypeId=0x01003F34C62B5DA5864A8B0A6B4718A44E8100AE7362BA141EF744B3338A7B0398B9F4
5 &RootFolder=/sites/Dev/Lists/ppStandorte
Am besten kann die URL für das Hostweb aus dem Parameter Source ermittelt werden. In meinem Code habe ich eine kleine Hilfsfunktion die die URL der HostWebs ermitteln kann:
1 getHostUrl() {
2 var url = decodeURIComponent(this.getUrlVar('SPHostUrl'));
3 if (url == "undefined") {
4 // wenn kein SPHostUrl übergeben wird könnte es in Source stehen -> EditForm...
5 var so: string = this.getSource();
6 if (so != "undefined") {
7 var pos = so.indexOf('/Lists/');
8 url = so.substr(0, pos);
9 }
10 }
11
12 return url;
13 }
Mit der so ermittelten URL zum Hostweb kann nun der AppContextSite erstellt werden und in die Liste im HostWeb das neue Element geschrieben werden.
Den Code der gesamten Lösung werde ich nach meiner Session zum Thema Remote Provisioning bei der SharePoint konferenz in Wien bereitstellen.