2009年12月21日月曜日

文書を編集できないよう制御する

アクセス制御リスト(ACL)上では便宜上、編集者としなければならないけれど、特定の条件下では閲覧できるけれども編集モードにさせたくない、といった場合がときどきあります。

編集モードで表示するには、表示モードで開いている状態から移行する他に、ビューから Ctrl + E 等で直接編集モードで開くといったパターンが考えられます。

表示モードから編集モードへ切り替える時、フォームのイベント Querymodechange で判定できます。
Sub Querymodechange( Source As Notesuidocument, Continue As Variant )
    If Not Source.EditMode Then
        If Isnull( Arraygetindex( Evaluate( "@UserRoles" ), "[Admin]", 5 ) ) Then Continue = False
    End If
End Sub

上のコードでは、Evaluate の戻り値が配列になるので Arraygetindex で配列のどこに管理者のロールがあるかを調べています。配列のどこにもなければ Null となり判定できます。


ビューから直接、編集モードで開く時、フォームのイベント QueryOpen で判定できます。
Sub Queryopen( Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant )
    If Not Isnewdoc Then
        If Mode = 1 Then
            dbadmin = Evaluate(|@IsMember( "[Admin]"; @UserRoles )|)
            If dbadmin( 0 ) = 0 Then Continue = False
        End If
    End If
End Sub

上のコードでは、@IsMember で管理者のロールが付与されているかどうかを調べています。ロールが付与されていなければ戻り値(配列)の0番目には0が入ります。

なお、新規文書の作成時には判定しないよう制御しています。
判定方法はいろいろあると思いますが、上のどちらも@関数とロールを活用してコードを簡単にしています。

0 件のコメント:

コメントを投稿