SharePoint 2013 リスト アイテムの新規作成フォーム、編集フォーム、表示フォームを作成する

こんにちは、SharePoint サポートの佐伯です。
今回の投稿では、リスト アイテムの新規作成フォーム、編集フォーム、表示フォームを作成する方法をご紹介します。

運用中にフォームを再作成するケース
本投稿に至った背景として、「リスト アイテムのフォームが壊れてしまった」、「リスト アイテムのフォームを誤って削除してしまった」ことから、フォームを再作成されたいというお問い合わせをいただくことがあります。その際に、具体的な方法が分からないとのお声をいただきましたので、今回はこれらのフォームの作成方法についてとりあげております。

リスト アイテムのフォームはサイトの画面上で作成することができません。フォームの作成には SharePoint Designer を使用するか、オブジェクト モデルを使用したプログラムを実装するという方法になります。下記でそれぞれの方法をご紹介します。
方法1) SharePoint Designer でフォームを作成する
方法2) PowerShell でフォームを作成する

方法1) SharePoint Designer でフォームを作成する
1. SharePoint Designer でリストの編集画面を開き、フォーム セクションで [新規作成] ボタンをクリックします。

2. [新しいリスト フォームの作成] ダイアログが表示されますので、ファイル名やフォームの種類を選んで [OK] をクリックします。ここでは、"アイテム作成フォーム" を選択します。

3. 以下のような新規作成フォームが作成されます。

このようにして、SharePoint Designer を使用して画面上の操作でフォームを作成することができますが、SharePoint 2013 サイトで既定で作成されるフォームとは異なる表示になります。例えば、People Picker が以下のように異なります。また、デザインが少々異なる箇所があります。

これは、SharePoint 2013 サイトで既定で作成されるフォーム Web パーツと SharePoint Designer で作成するフォーム Web パーツでは、それぞれ使用しているクラスが異なるためです。前者は ListFormWebPart クラスを使用し、後者は DataFormWebPart クラスを使用します。

ListFormWebPart クラスを使用したフォーム Web パーツでは、Web パーツの編集でレンダリング モードを選択することができます。クライアント レンダリングとサーバー レンダリングの 2 つのモードがあり、既定ではクライアント レンダリングが設定されています。
DataFormWebPart クラスを使用したフォーム Web パーツは、サーバー レンダリングで Web パーツが描画されます。サーバー レンダリングでは、People Picker 等、古いバージョンの形式で表示される項目があります。

SharePoint 2013 サイトで既定で作成されるフォームでも、レンダリング モードをサーバー レンダリングにすると、People Picker は古いバージョン形式で表示されます。
 参考) クライアント レンダリングとサーバー レンダリングの詳細は、下記のブログ記事で紹介しております。
SharePoint のサーバー サイド・クライアント サイド レンダリングについて

方法2) PowerShell でフォームを作成する
SharePoint 2013 サイトで既定で作成されるアイテムのフォームと同様のフォームを作成する場合は、SharePoint のオブジェクト モデルを使用したプログラムを実装します。本投稿では、PowerShell を使用してフォームを作成するサンプルをご紹介します。

■サンプル

$web = Get-SPWeb <Web サイトの URL>$list = $web.Lists["<リスト名>"]$files = $list.RootFolder.Files$url = $list.RootFolder.ServerRelativeUrl + "/" + "<フォームのファイル名>"$form = $files.Add($url, [Microsoft.SharePoint.SPTemplateFileType]::FormPage)$listFormWebPart = New-Object ([Microsoft.SharePoint.WebPartPages.ListFormWebPart])$iListWebPart = [Microsoft.SharePoint.WebPartPages.IListWebPart]($listFormWebPart)$iListWebPart.ListId = $list.ID$iListWebPart.PageType = [Microsoft.SharePoint.PAGETYPE]::<フォームの種類>$webPartManager = $form.GetLimitedWebPartManager([System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)$webPartManager.AddWebPart($listFormWebPart, "Main", 1)$web.Dispose()

補足 : 以下のように値を設定します。
<Web サイトの URL> https://sharepoint
<リスト名> カスタム リスト
<フォームのファイル名> TestForm.aspx
<フォームの種類> PAGETYPE には該当のフォームの種類を指定します。
表示フォーム : PAGE_DISPLAYFORM
新規作成フォーム : PAGE_NEWFORM
編集フォーム : PAGE_EDITFORM

参考) PAGETYPE 列挙型の詳細は下記の公開情報をご参照ください。
https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.pagetype.aspx

例) リスト アイテムの表示フォームを作成する

$web = Get-SPWeb https://sharepoint$list = $web.Lists["カスタム リスト"]$files = $list.RootFolder.Files$url = $list.RootFolder.ServerRelativeUrl + "/" + "TestDispForm.aspx"$form = $files.Add($url, [Microsoft.SharePoint.SPTemplateFileType]::FormPage)$listFormWebPart = New-Object ([Microsoft.SharePoint.WebPartPages.ListFormWebPart])$iListWebPart = [Microsoft.SharePoint.WebPartPages.IListWebPart]($listFormWebPart)$iListWebPart.ListId = $list.ID$iListWebPart.PageType = [Microsoft.SharePoint.PAGETYPE]::PAGE_DISPLAYFORM$webPartManager = $form.GetLimitedWebPartManager([System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)$webPartManager.AddWebPart($listFormWebPart, "Main", 1)$web.Dispose()

いかがでしたか。今回の投稿は以上です。