リボンメニューのタブを権限に従って表示 / 非表示にする方法

こんにちは。SharePoint サポートの多田です。

今回は、マスターページにおいてリボンメニューのタブを権限に従って表示 / 非表示にする方法をご案内したいと思います。

今回表示 / 非表示を実現する部分は以下になります。

・ページタブ

li タグ: <li class="ms-cui-tt" id="Ribbon.WikiPageTab-title" role="tab" unselectable="on">

・リストツール

li タグ : <li class="ms-cui-cg ms-cui-cg-lb" id="Ribbon.ListContextualGroup" unselectable="on">

・ライブラリツール

li タグ : <li class="ms-cui-cg ms-cui-cg-db" id="Ribbon.LibraryContextualGroup" unselectable="on">

・予定表ツール

li タグ : <li class="ms-cui-cg ms-cui-cg-gr" id="Ribbon.Calendar" unselectable="on">

※ リボンメニューの li タグの id は後述する実現手順で使用します。また、リボンメニューの li タグを確認する場合は、IE で F12 キーを押し開発者ツールを起動し、"矢印" マークをクリックしリボンメニューをポイントすることで確認可能です。

- 実施手順

1. SharePoint Designer を起動し、マスターページ (v4.master) をチェックアウトして開きます。

2. <div id="s4-ribboncont"> タグを探します。このタグがリボン部分を示すタグになります。

3. <div id="s4-ribboncont"> タグのタグを閉じる部分の直下に以下の記述を加え、マスターページを保存し、チェックインします。またマスターページの変更を有効化するにはマスターページの承認が必要になります。

記述を加える部分

--------

<div id="s4-ribboncont">

・・・

・・・

・・・

</div>

<---- ここに記述します。

--------

加える記述

--------

<!-- ページタブの表示 / 非表示 -->

<script type="text/javascript">

            document.getElementById("Ribbon.WikiPageTab-title").style.display = "none";

</script>

<Sharepoint:SPSecurityTrimmedControl ID="SPSecurityTrimmedControl2" runat="server" PermissionsString="FullMask">

    <script type="text/javascript">

        document.getElementById("Ribbon.WikiPageTab-title").style.display = "block";

    </script>

</Sharepoint:SPSecurityTrimmedControl>

 

<!-- ライブラリツールの表示 / 非表示 -->

<script type="text/javascript">

            document.getElementById("Ribbon.LibraryContextualGroup").style.display = "none";

</script>

<Sharepoint:SPSecurityTrimmedControl ID="SPSecurityTrimmedControl3" runat="server" PermissionsString="FullMask">

    <script type="text/javascript">

        document.getElementById("Ribbon.LibraryContextualGroup").style.display = "block";

    </script>

</Sharepoint:SPSecurityTrimmedControl>

 

<!-- リストツールの表示 / 非表示 -->

<script type="text/javascript">

            document.getElementById("Ribbon.ListContextualGroup").style.display = "none";

</script>

<Sharepoint:SPSecurityTrimmedControl ID="SPSecurityTrimmedControl4" runat="server" PermissionsString="FullMask">

    <script type="text/javascript">

        document.getElementById("Ribbon.ListContextualGroup").style.display = "block";

    </script>

</Sharepoint:SPSecurityTrimmedControl>

 

<!-- 予定表ツールの表示 / 非表示 -->

<script type="text/javascript">

            document.getElementById("Ribbon.Calendar").style.display = "none";

</script>

<Sharepoint:SPSecurityTrimmedControl ID="SPSecurityTrimmedControl5" runat="server" PermissionsString="FullMask">

    <script type="text/javascript">

        document.getElementById("Ribbon.Calendar").style.display = "block";

    </script>

</Sharepoint:SPSecurityTrimmedControl>

--------

※ 上記のサンプルでは各リボンメニューごとに記述を分けています。これは以下のように JavaScript の記述をまとめて書くと JavaScript エラーが発生し、後続の処理が行われないためです。例えば Ribbon.WikiPageTab-title の id がないドキュメント ライブラリなどのページにアクセスした時は以下のサンプルの 1 行目で JavaScript エラーが発生し後続の処理が行われません。上記のサンプルでは同じく JavaScript エラーは発生しますが、1 つずつスクリプトタグで閉じているため後続の処理が行われます。JavaScript エラーを発生させないようにする場合は、null チェック等の機能を実装します。

<script type="text/javascript">

            document.getElementById("Ribbon.WikiPageTab-title").style.display = "none";

            document.getElementById("Ribbon.ListContextualGroup").style.display = "none";

            document.getElementById("Ribbon.ListContextualGroup").style.display = "none";

            document.getElementById("Ribbon.LibraryContextualGroup").style.display = "none";

            document.getElementById("Ribbon.Calendar").style.display = "none";

</script>

 

- 記述内容の説明

まずはじめに JavaScript を使用してページタブ、リストツール、ライブラリツール、予定表ツールを一旦非表示にしています。

document.getElementById("Ribbon.WikiPageTab-title").style.display = "none";

次に SPSecurityTrimmedControl コントロールを使用しています。SPSecurityTrimmedControl コントロールは、SPSecurityTrimmedControl コントロールタグで囲まれたコードを、PermissionsString 属性に指定された権限セットを持つユーザーのみに表示させるものになります。

今回は FullMask がついておりますので、フルコントロールを持つユーザー (サイトの所有者等) のみに SPSecurityTrimmedControl コントロールタグ内のコードを表示させる動作になります。

<Sharepoint:SPSecurityTrimmedControl ID="SPSecurityTrimmedControl2" runat="server" PermissionsString="FullMask">

SPSecurityTrimmedControl コントロールタグ内で JavaScript を使用して、一旦非表示にしたページタブ、リストツール、ライブラリツール、予定表ツールをフルコントロールを持つユーザーのみに表示させております。

document.getElementById("Ribbon.Calendar").style.display = "block";

SPSecurityTrimmedControl コントロールについては以下の資料をご覧ください。

タイトル : SPSecurityTrimmedControl Class

アドレス : https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spsecuritytrimmedcontrol.aspx

タイトル : SPBasePermissions Enumeration

アドレス : https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spbasepermissions.aspx

- マスターページかフィーチャーか?

今回はマスターページをカスタマイズしてリボンメニューを操作しておりますが、既存のリボンメニューを非表示にしたり、新規のリボンメニューを追加したりする場合は CustomAction 属性を使用してフィーチャーを作成することでも実現可能です。

しかしながらフィーチャーは、サイト単位やサイトコレクション単位など、機能を有効化する範囲を選べる利点がある一方、バージョン管理が煩雑であり、バージョンアップさせるために一度フィーチャーをアンインストールする必要がある場合がございます。

そのため、サイト単位を超えた広範囲で機能を有効化したい場合や、アセンブリを含む高機能なアプリケーションを展開する場合はフィーチャーを使用することをおすすめします。サイト内のみで有効化する場合は今回ご案内しているマスターページを編集する方法が有効になります。

CustomAction 属性を使用してリボンメニューを操作する方法については以下の技術資料をご覧下さい。

タイトル : SharePoint 2010 Server リボンのカスタマイズと展開

アドレス : https://msdn.microsoft.com/ja-jp/library/gg552606.aspx

タイトル : [チュートリアル] Server リボンからボタンを削除する

アドレス : https://msdn.microsoft.com/ja-jp/library/ff408060.aspx

タイトル : 既定のサーバー リボンのカスタマイズの場所

アドレス : https://msdn.microsoft.com/ja-jp/library/ee537543.aspx

- 補足事項

弊社 SharePoint サポートでは、SharePoint 2010 で公開されているクライアント オブジェクトモデル (JavaScript のクラスライブラリ) 以外の JavaScript によるカスタマイズに関するサポートサービスを実施しておりません。恐れ入りますがご了承くださいますようお願いいたします。

 

(※ 2012/06/04 追記)

上記の方法では、アイテムを選択した際に JavaScript によりリボンメニューの再レンダリングが行われ、リボンメニューが表示されます。

アイテムを選択した際にもリボンメニューを表示させたくない場合には、アイテムがクリックされた際に呼ばれる JavaScript の関数内にて、権限に応じてリボンメニューの再レンダリングをキャンセルする必要があります。

アイテムがクリックされた際には、init.js の SelectRibbonTab メソッドが呼ばれリボンメニューの再レンダリングが行われます。リボンメニューを再レンダリングさせないためには、以下のように、権限に応じてこのメソッドの処理をキャンセルする方法が考えられます。

 

1. Boolean 値を用意し、既定値として false を設定しておきます

2. 上記の手順で追加している SPSecurityTrimmedControl コントロール内で、手順 1 で用意した Boolean 値に true を設定します。(権限のあるユーザーでページにアクセスした場合のみ
Boolean 値が True となります。)

3. SelectRibbonTab メソッド内で手順 1. で作成した Boolean 値のチェックを行い、false だった場合は、return 等で処理をキャンセルしてリボンメニューがレンダリングされないようにします。

 

※ init.js は既定では以下のディレクトリに存在します。

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\1041 (日本語環境の場合)

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\1033 (英語環境の場合)

 

弊社では JavaScript を使用したカスタマイズ方法をサポートしておりません。このため、本方法は広範囲なテストを実施していないため、採用頂く場合は十分なテストを実施した上でご使用ください。また、14 ハイブ以下のファイルの編集については以下の内容についてご注意ください。

- 14 ハイブ以下のカスタマイズはファーム全体に影響を及ぼします。

- 14 ハイブ以下のカスタマイズはファーム内のすべてのサーバーにおいて実施する必要がございます。

- 14 ハイブ以下に配置された既定のファイルは、今後のサービスパックや修正プログラムで上書きされる場合があります。ファイルが上書きされた場合、再度上書きされたファイルに同様の修正を実施する必要がございます。

- この変更によって万が一予期せぬ動作が生じた場合は、バックアップ ファイルより変更を元に戻す必要がございます。

(※ 2012/06/05 追記)

リボンの "参照" タブをクリックした際もリボンメニューの再レンダリングが行われ、リボンメニューが表示されます。

"参照" タブは以下のコードにより非表示にすることが可能です。一度 "参照" タブを非表示にし、SPSecurityTrimmedControl コントロール内で再表示する等してお使いください。

 document.getElementById("Ribbon.Read-title").style.display = "none";

※ リボンの "参照" タブをクリックした際には init.js 内の EnsureScript メソッドにてリボンメニューが再レンダリングされますが、EnsureScript メソッドは他の多数のメソッドから呼ばれるため、編集しないことをおすすめします。