[操作]メニューから、エンドユーザーに利用させたくない、もしくは利用することがないメニューを非表示にしたいというニーズをよく耳にします。
なんとか実現させたいと思うのですが、これがなかなか頭を悩ませる話なのです。新しいメニューを追加することは、カスタムのフィーチャを定義してやることで割と簡単に実現できます。しかし、既存のメニューを非表示にすることは難しい。MSDNなどを見るとフィーチャ定義によってメニューの非表示が可能だと書いてはあるのですが、既存メニューの非表示を試すと動いてくれません。これについては 海外のサイトもさんざん確認してみましたが、皆さんことごとく「うまく動かない」とコメントしています。ということで、現実的にフィーチャで対応するのは難しそうです。
Web で関連情報を調べてみると 2つのアプローチが現実的に利用できそうです。一つは、ToolbarActionsMenu のテンプレートを編集する方法であり、もうひとつはJavaScript による HTML DOM 操作によるカスタマイズ方法です。
具体的な目標を定めたほうがわかりやすいと思いますので、今回は "Windows エクスプローラで開く" 機能を非表示してみます。実は、意外と多くご質問いただくのが、ドキュメント ライブラリ上でWindows エクスプローラで開く"機能を使わせないようするにはどうしたらよいかというものです。
※なお、これを実現するには「エクスプローラ ビュー」の削除もお忘れなく。
サーバーファーム内の全サイト コレクションに対して一括設定する
こちらは、DefaultTemplate.ascx を編集する方法です。
- SharePoint ハイブ 内の\TEMPLATE\CONTROLTEMPLATES フォルダ内の defaultTemplate.ascxをバックアップ用にコピーし、CONTROLTEMPLATES フォルダとは別のフォルダに保存しておきます。
- defaultTemplate.ascx をメモ帳またはSharePoint Designer 2007 などで開きます。なお、SharePoint Designer 2007 で開いた場合はデザインビューは使用できないため、コードビューに切り替えておいてください。
- 次のタグを削除し、上書き保存します("OpenInExplorer" で検索するとすぐに見つかります)。※このタグの部分がエクスプローラビュー表示を生成しています。
<SharePoint:MenuItemTemplate
ID="OpenInExplorer"
Text="<%$Resources:wss,ToolBarMenuItemOpenInExplorer%>"
Description="<%$Resources:wss,ToolBarMenuItemOpenInExplorerDescription%>"
PermissionsString="UseClientIntegration"
PermissionContext="CurrentList"
MenuGroupId="200"
Sequence="300"
UseShortId="true"
runat="server"/> - IISを再起動します。
※3.のタグが含まれる <SharePoint:RenderingTemplate ID="ToolbarActionsMenu" runat="server">からタグ内にツールバーに表示されるメニューが定義されています。
サイト単位やリスト単位で設定する
JavaScript で HTML DOM を操作する方法です。まず、操作ターゲットとなるタグを見極めます。任意のドキュメントライブラリの「すべてのドキュメント」ビューを表示して、任意の場所を右クリックし [ソースの表示] をクリックし、生成されるコードを確認します。たとえば今回のように 'Windows エクスプローラで開く' 部分は、私の環境では次のようなコードが出力されていることがわかります。
****************************
<ie:menuitem id="zz22_OpenInExplorer" type="option" onMenuClick="NavigateHttpFolder('http:\u002f\u002fmoss2007\u002fsites\u002ftop\u002fSiteDirectory\u002fsoumu\u002fShared Documents', '_blank');" hidden="!(SupportsNavigateHttpFolder())" text="Windows エクスプローラで開く" description="ファイルをこのライブラリにドラッグ アンド ドロップしてください。" menuGroupId="200"></ie:menuitem>
***************************
あとは、この情報を元にロジックを構成するだけです。
【リスト(ドキュメント ライブラリ)単位での設定】
特定のビュー ファイル (たとえば、AllItems.aspx) の<asp:ContentPlaceHolder id="PlaceHolderMain" runat="server">タグ内にスクリプトを記述します。
【サイト単位での設定】
カスタムのマスタページを作成し、スクリプトを記述します。※ここでは、サイトコレクションで発行インフラストラクチャ機能が有効になっていることを前提とします。
カスタムのマスタページの作成
- SharePoint Designer 2007 でサイトコレクションのトップレベルサイトを開きます。
- [フォルダ一覧] から"_catalogs"-"masterpage(マスタページギャラリー)" を開きます。
- default.master のコピーを同一フォルダ内に作成し、任意のファイル名に変更します。たとえば "myDefault.master" とします。
- body タグの終了タグの直前あたりにスクリプトを記述します。
カスタムのマスタページの適用
- 設定を適用したいサイトの [サイトの設定] - [外観] セクションの [マスタページ]からシステムマスタページの方を、カスタムのマスタページ (myDefault.master) に変更します。
***使用するスクリプト例****
<script type="text/javascript">
<!--
_spBodyOnLoadFunctionNames.push('hideOpenInExplorer');
function hideOpenInExplorer()
{
//エクスプローラで開くメニューを非表示
removeTags('_OpenInExplorer');
}
function removeTags(menuId){
var tags=document.getElementsByTagName('ie:menuitem');
if(tags==null){return;}
for (i=0;i<tags.length;i++)
{
var id=tags[i].id;
var searchTagId=id.substring(id.indexOf('_'),id.length);
if(searchTagId==menuId)
{
tags[i].parentNode.removeChild(tags[i]);
return;
}
}//for
}//function
//-->
</script>
*****************************************************
removeTags関数の引数にメニューIDを指定します。各メニューのIDは以下の通りです。
- Windows エクスプローラで開く→_OpenInExplorer
- データシートで編集→_EditInGridButton
- Outlook に接続→_OfflineButton
- スプレッドシートにエクスポート→_ExportToSpreadsheet
[図.既定の4つのメニューを非表示にしたところ]
コメント