新 サブサイト→トップレベルサイト -(2)- サブサイト作成とロールのコピー [技術情報]
前回までのプログラムで新しいコンテンツDBの作成と新しいサイトコレクション+トップレベルサイトまで作成できました。
今回から複数回に分けてサブサイトをコピーしようと思います。
仕様としてサブサイトは階層構造で作成されていますので、コピーする部分は再帰的に呼ばれてもいいように考慮する必要性があります。私の場合はFunctionを使用して再帰的に呼ばれるようにしました。
前提(パラメータ)
RootWeb … コピー先ルートサイト
TargetWeb … コピー元サブサイト
戻り値
コピー後サブサイト
Public Function CopyNewWeb(ByVal RootWeb As SPWeb, _
ByVal TargetWeb As SPWeb) As SPWeb
まず、コピー先ルートサイト配下に新規のサイトを作成します。
Dim strWebUrl As String '-- コピー先サイトURL
strWebUrl = TargetWeb.Url.Split("/")(TargetWeb.Url.Split("/").Length - 1)
CopyNewWeb = RootWeb.Webs.Add( _
strWebUrl, TargetWeb.Title, TargetWeb.Description, _
TargetWeb.Language, TargetWeb.WebTemplate, _
TargetWeb.HasUniquePerm, False)
次にRoleをコピーします。が、そこで注意です。SharePointの標準的なロールには管理者、Webデザイナ、投稿者、閲覧者、ゲストが存在します。しかし、ゲストはサイト自体に権限がない状態でリストやドキュメントライブラリに権限を付与した際に使用されるロールでこのロールは作成することができないようです。そこでゲストロールは省きます。ゲストロールかの判断はSPRoleType.Guestの値を使用します。
Dim TargetRole as SPRole
For Each TargetRole In TargetWeb.Roles
'--- Guestは対象外
If TargetRole.Type <> SPRoleType.Guest Then
'--- 当該ロールが存在した場合にTrueにする
Flg = False
'--- コピー先サイトのロール
For Each NewRole In NewWeb.Roles
'--- Guestは対象外
If NewRole.Type <> SPRoleType.Guest Then
'--- ロールの比較
If TargetRole.Name = NewRole.Name Then
Flg = True
Exit For
End If
End If
Next
'--- 該当ロールが存在しなかった場合は追加する
If Flg = False Then
'--- ロールの追加
NewWeb.Roles.Add(TargetRole.Name,
_ TargetRole.Description, TargetRole.PermissionMask)
End If
End If
Next
次回はユーザーとクロスサイトグループの追加をしようと思います。