操作別タブでカスタム Web パーツを作成する

最終更新日: 2011年2月4日

適用対象: SharePoint Foundation 2010

この記事の内容
SharePoint プロジェクトの作成
Web パーツの実装
ページ コンポーネントの作成
カスタマイズの展開

このトピックでは、Microsoft SharePoint Foundation の Server リボンで操作別タブを開くカスタム Web パーツを作成する方法について説明します。

前提条件

Microsoft SharePoint Foundation 2010

Microsoft Visual Studio 2010 の SharePoint 開発者ツール

SharePoint プロジェクトの作成

Web パーツとリボンのカスタマイズを行うには、まず、空の SharePoint プロジェクトを作成します。

SharePoint プロジェクトを作成するには

  1. Visual Studio 2010 を起動します。

  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  3. [プロジェクトの種類] で、[C#] の [空の SharePoint プロジェクト] を選択します。

  4. プロジェクト名として「ContextualTabWebPart」と入力し、[OK] をクリックします。

  5. SharePoint カスタマイズ ウィザードで [ファーム ソリューションとして配置する] を選択し、[完了] をクリックします。

Web パーツの実装

次に、Web パーツを実装します。

Web パーツを実装するには

  1. ソリューション エクスプローラーで [参照] を右クリックし、[参照の追加] を選択します。

  2. [参照の追加] ダイアログ ボックスで [.NET] タブを選択し、[Microsoft.Web.CommandUI.dll] を選択します。[OK] をクリックします。

  3. ソリューション エクスプローラーで [ContextualTabWebPart] プロジェクトを右クリックし、[追加] をポイントし、[新しいアイテム] を選択します。

  4. [新しいアイテムの追加] ダイアログ ボックスで [Web パーツ] を選択します。名前として「ContextualTabWebPart」と入力します。

  5. Web パーツが追加され、ContextualTabWebPart.cs ファイルが表示されたら、以下のステートメントを追加します。

    using System.Xml;
    using Microsoft.Web.CommandUI;
    
  6. 次に、以下のコードに示すように、IWebPartPageComponentProvider インターフェイスを実装します。これについては後で作業します。

    public class ContextualTabWebPart : WebPart, IWebPartPageComponentProvider
    

    次に、リボン XML 用のグローバル文字列変数を 2 つ作成します。この 2 つの変数は、操作別タブとグループ テンプレートを定義します。リボン XML の詳細については、「Server リボン XML」を参照してください。

  7. contextualTab 文字列で、ContextualGroup 要素を確認します。この要素は、以下の Tab 要素を操作別タブとして定義します。Color 属性は、タブがレンダリングされるときにタブの色を定義します。Id と ContextualGroupId は、グループ内で一意の識別子です。Sequence 属性は、操作別タブがどこにレンダリングされるかを定義します。以下のコードは 2 つのグローバル文字列変数を実装します。

    private string contextualTab = @"
       <ContextualGroup Color=""Magenta"" 
         Command=""CustomContextualTab.EnableContextualGroup"" 
         Id=""Ribbon.CustomContextualTabGroup"" 
         Title=""Custom Contextual Tab Group"" 
         Sequence=""502"" 
         ContextualGroupId=""CustomContextualTabGroup"">
              <Tab 
                  Id=""Ribbon.CustomTabExample"" 
                  Title=""My Custom Tab"" 
                  Description=""This holds my custom commands!"" 
                  Command=""CustomContextualTab.EnableCustomTab"" 
                  Sequence=""501"">
                <Scaling
                  Id=""Ribbon.CustomTabExample.Scaling"">
                  <MaxSize
                    Id=""Ribbon.CustomTabExample.MaxSize"" 
                    GroupId=""Ribbon.CustomTabExample.CustomGroupExample"" 
                    Size=""OneLargeTwoMedium""/>
                  <Scale 
                    Id=""Ribbon.CustomTabExample.Scaling.CustomTabScaling""
                    GroupId=""Ribbon.CustomTabExample.CustomGroupExample"" 
                    Size=""OneLargeTwoMedium"" />
                </Scaling>
                <Groups Id=""Ribbon.CustomTabExample.Groups"">
                  <Group 
                    Id=""Ribbon.CustomTabExample.CustomGroupExample"" 
                    Description=""This is a custom group!"" 
                    Title=""Custom Group"" 
                    Command=""CustomContextualTab.EnableCustomGroup"" 
                    Sequence=""52"" 
                    Template=""Ribbon.Templates.CustomTemplateExample"">
                    <Controls 
                      Id=""Ribbon.CustomTabExample.CustomGroupExample.Controls"">
                      <Button 
                        Id=""Ribbon.CustomTabExample.CustomGroupExample.HelloWorld"" 
                        Command=""CustomContextualTab.HelloWorldCommand"" 
                        Sequence=""15"" 
                        Description=""Says hello to the World!"" 
                        LabelText=""Hello, World!"" 
                        TemplateAlias=""cust1""/>
                      <Button 
                        Id=""Ribbon.CustomTabExample.CustomGroupExample.GoodbyeWorld"" 
                        Command=""CustomContextualTab.GoodbyeWorldCommand"" 
                        Sequence=""17"" 
                        Description=""Says good-bye to the World!"" 
                        LabelText=""Good-bye, World!"" 
                        TemplateAlias=""cust2""/>
                    </Controls>
                  </Group>
                </Groups>
              </Tab>
       </ContextualGroup>";
     
            private string contextualTabTemplate = @"
              <GroupTemplate Id=""Ribbon.Templates.CustomTemplateExample"">
                <Layout 
                  Title=""OneLargeTwoMedium"" LayoutTitle=""OneLargeTwoMedium"">
                  <Section Alignment=""Top"" Type=""OneRow"">
                    <Row>
                      <ControlRef DisplayMode=""Large"" TemplateAlias=""cust1"" />
                    </Row>
                  </Section>
                  <Section Alignment=""Top"" Type=""TwoRow"">
                    <Row>
                      <ControlRef DisplayMode=""Medium"" TemplateAlias=""cust2"" />
                    </Row>
                    <Row>
                      <ControlRef DisplayMode=""Medium"" TemplateAlias=""cust3"" />
                    </Row>
                  </Section>
                </Layout>
              </GroupTemplate>";
    
  8. DelayScript という名前の新しい文字列プロパティを作成します。DelayScript には、カスタム ページ コンポーネントを追加し登録する ECMAScript (JavaScript、JScript) が含まれます。このトピックでは後ほどカスタム ページ コンポーネントを作成します。_addCustomPageComponent メソッドはカスタム ページ コンポーネントを作成して、ページ マネージャーにそれを追加します。すべての Web パーツがページ コンポーネントを持っており、カスタム ページ コンポーネント オブジェクトを作成するときは Web パーツのページ コンポーネント ID を使用します。これは、操作に応じてカスタムのリボン タブに切り替えられるように、Web パーツをページ コンポーネントに関連付けるのに必要です。_registerCustomPageComponent メソッドは、ページが読み込まれたとき JavaScript ファイルを登録します。

    以下のコードは DelayScript を実装します。

            public string DelayScript 
            {
                get
                {
                    string webPartPageComponentId = SPRibbon.GetWebPartPageComponentId(this);
                    return @"
    <script type=""text/javascript"">
    //<![CDATA[
     
                function _addCustomPageComponent()
                {
                    var _customPageComponent = new ContextualTabWebPart.CustomPageComponent('" + webPartPageComponentId + @"');
                    SP.Ribbon.PageManager.get_instance().addPageComponent(_customPageComponent);
                }
     
                function _registerCustomPageComponent()
                {
                    SP.SOD.registerSod(""CustomContextualTabPageComponent.js"", ""\/_layouts\/CustomContextualTabPageComponent.js"");
                    SP.SOD.executeFunc(""CustomContextualTabPageComponent.js"", ""ContextualWebPart.CustomPageComponent"", _addCustomPageComponent);
                }
                SP.SOD.executeOrDelayUntilScriptLoaded(_registerCustomPageComponent, ""sp.ribbon.js"");
    //]]>
    </script>";
                }
            }
    
  9. AddContextualTab という名前の新しい関数を作成します。AddContextualTab メソッド内に、リボンに操作別タブとカスタム テンプレートを登録するコードを挿入します。RegisterDataExtension(XmlNode, String) メソッドを、リボン拡張機能を登録するために使用します。RegisterDataExtension(XmlNode, String) は、渡された XML を読み込む対象をリボンに対して指定します。CMDUI.xml の ContextualTabs および Templates 要素の ID を使用します。

    以下のコードは AddContextualTab メソッドを実装します。

            private void AddContextualTab()
            {
     
                // Get the current instance of the ribbon on the page.
                Microsoft.Web.CommandUI.Ribbon ribbon = SPRibbon.GetCurrent(this.Page);
     
                // Prepare an XmlDocument object used to load the ribbon extensions.
                XmlDocument ribbonExtensions = new XmlDocument();
     
                // Load the contextual tab XML and register the ribbon extension.
                ribbonExtensions.LoadXml(this.contextualTab);
                ribbon.RegisterDataExtension(ribbonExtensions.FirstChild, "Ribbon.ContextualTabs._children");
     
                // Load the custom templates and register the ribbon extension.
                ribbonExtensions.LoadXml(this.contextualTabTemplate);
                ribbon.RegisterDataExtension(ribbonExtensions.FirstChild, "Ribbon.Templates._children");
            }
    
  10. 次に、IWebPartPageComponentProvider インターフェイスの WebPartContextualInfo プロパティを実装する必要があります。インターフェイスを実装するには、[IWebPartPageComponentProvider] を右クリックし、[インターフェイスの実装]、[インターフェイスを明示的に実装] の順に選択します。

    このインターフェイスは、リボンに、Web パーツがいつ選択されたか、どのコンテキスト グループとタブを表示するかを知らせます。コンテキスト グループを追加するとき、ユーザーはそれに対してコンテキスト グループ、VisibilityContext、および Command の ID を送ります。ID は、リボン XML の ContextualGroup 要素の Id プロパティにマップされます。VisibilityContext はコントロールのグループの表示と非表示を切り替えるために使用されます。Command パラメーターは、リボン XML の ContextualGroup 要素の Command にマップされます。また、リボン XML で定義されたタブを追加します。そのためには、タブの Id および VisibilityContext パラメーターを渡します。WebPartContextualInfo のための以下のコードを挿入します。

            public WebPartContextualInfo WebPartContextualInfo
            {
                get 
                {
                    WebPartContextualInfo info = new WebPartContextualInfo();
                    WebPartRibbonContextualGroup contextualGroup = new WebPartRibbonContextualGroup();
                    WebPartRibbonTab ribbonTab = new WebPartRibbonTab();
     
                    // Create the contextual group object and initialize its values.
                    contextualGroup.Id = "Ribbon.CustomContextualTabGroup";
                    contextualGroup.Command = "CustomContextualTab.EnableContextualGroup";
                    contextualGroup.VisibilityContext = "CustomContextualTab.CustomVisibilityContext";
     
                    // Create the tab object and initialize its values.
                    ribbonTab.Id = "Ribbon.CustomTabExample";
                    ribbonTab.VisibilityContext = "CustomContextualTab.CustomVisibilityContext";
     
                    // Add the contextual group and tab to the WebPartContextualInfo.
                    info.ContextualGroups.Add(contextualGroup);
                    info.Tabs.Add(ribbonTab);
                    info.PageComponentId = SPRibbon.GetWebPartPageComponentId(this);
     
                    return info;
                }
            }
    
  11. 次に、OnPreRender メソッドを実装します。これにより、ページにレンダリングされる前に、リボンに要素を追加することができます。OnPreRender 内部で AddContextualTab メソッドを呼び出して、DelayScript を ClientScriptManager に登録します。

    以下のコードは OnPreRender メソッドを実装します。

            protected override void OnPreRender(EventArgs e)
            {
                base.OnPreRender(e);
     
                this.AddContextualTab();
     
                ClientScriptManager clientScript = this.Page.ClientScript;
                clientScript.RegisterClientScriptBlock(this.GetType(), "ContextualTabWebPart", this.DelayScript);
     
            }
    

    これで Web パーツは完成しました。次に、ページ コンポーネントを作成します。

ページ コンポーネントの作成

ページ コンポーネントは Server リボンを操作するための JavaScript オブジェクトです。ページ コンポーネントの詳細なチュートリアルについては、「Server リボンのページ コンポーネントを開発する」を参照してください。ページ コンポーネントを適切に操作するには、モジュールを使用して、それを %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\\TEMPLATES\LAYOUTS ディレクトリに展開する必要があります。これにより、リボンのコマンドが有効になり、リボン XML で定義したコマンドに応答するようになります。

ページ コンポーネントを追加して定義するには

  1. ソリューション エクスプローラーで [ContextualTabWebPart] プロジェクトを右クリックし、[追加] をポイントし、[新しいアイテム] を選択します。

  2. [新しいアイテムの追加] ダイアログ ボックスで [モジュール] テンプレートを選択し、[名前] として「CustomContextualTabPageComponent」と入力します。[追加] をクリックします。

  3. 追加された既定のファイルは不要です。ソリューション エクスプローラーElements.xmlSample.txt を削除します。

  4. 次に、JavaScript ファイルを追加する必要があります。[CustomContextualTabPageComponent] を右クリックし、[追加] をポイントし、[新しいアイテム] を選択します。

  5. [インストールされているテンプレート] リストの [Visual C#] の下で [Web] を選択します。[Jscript ファイル] を種類として選択し、名前として「CustomContextualTabPageComponent」と入力します。

  6. 展開場所を設定し、ファイルが _layouts ディレクトリに展開されるようにします。それには、ソリューション エクスプローラーCustomContextualTabPageComponent.js を選択します。[プロパティ] ウィンドウで、[展開の種類] をルート ファイルに設定します。[配置場所] プロパティを開いて、[パス] プロパティに「TEMPLATE\LAYOUTS」と入力します。

    以下のコードを CustomContextualTabPageComponent.js ファイルに追加して、カスタム ページ コンポーネントを実装します。

    Type.registerNamespace('ContextualTabWebPart');
     
    var _webPartPageComponentId;
    ContextualTabWebPart.CustomPageComponent = function ContextualTabWebPart_CustomPageComponent(webPartPcId) {
        this._webPartPageComponentId = webPartPcId;
        ContextualTabWebPart.CustomPageComponent.initializeBase(this);
    }
    ContextualTabWebPart.CustomPageComponent.prototype = {
     
        init: function ContextualTabWebPart_CustomPageComponent$init() {  },
     
        getFocusedCommands: function ContextualTabWebPart_CustomPageComponent$getFocusedCommands() {
            return ['CustomContextualTab.EnableCustomTab', 'CustomContextualTab.EnableCustomGroup', 'CustomContextualTab.HelloWorldCommand', 'CustomContextualTab.GoodbyeWorldCommand'];
        },
     
        getGlobalCommands: function ContextualTabWebPart_CustomPageComponent$getGlobalCommands() {
            return [];
        },
     
        isFocusable: function ContextualTabWebPart_CustomPageComponent$isFocusable() {
            return true;
        },
        
        canHandleCommand: function ContextualTabWebPart_CustomPageComponent$canHandleCommand(commandId) {
            // Contextual Tab commands
            if ((commandId === 'CustomContextualTab.EnableCustomTab') || (commandId === 'CustomContextualTab.EnableCustomGroup') || (commandId === 'CustomContextualTab.HelloWorldCommand') || (commandId === 'CustomContextualTab.GoodbyeWorldCommand')) {
                return true;
            }
        },
     
        handleCommand: function ContextualTabWebPart_CustomPageComponent$handleCommand(commandId, properties, sequence) {
     
            if (commandId === 'CustomContextualTab.HelloWorldCommand') {
                alert('Hello, world!');
            }
            if (commandId === 'CustomContextualTab.GoodbyeWorldCommand') {
                alert('Good-bye, world!');
            }
        },
     
        getId: function ContextualTabWebPart_CustomPageComponent$getId() {
            return this._webPartPageComponentId;
        }
    }
     
     
    ContextualTabWebPart.CustomPageComponent.registerClass('ContextualTabWebPart.CustomPageComponent', CUI.Page.PageComponent);
    SP.SOD.notifyScriptLoadedAndExecuteWaitingJobs("CustomContextualTabPageComponent.js");
    

カスタマイズの展開

プロジェクトは Visual Studio 2010 の SharePoint 開発者ツールによって自動的に展開されます。アプリケーション プールは、展開プロセスの一環として自動的にリセットされます。

Web パーツを展開するには

  1. F5 キーを押します。Visual Studio 2010 の SharePoint 開発者ツールによって、Web パーツと JavaScript ファイルが自動的にビルドおよび展開されます。

  2. ユーザーのサイトに移動します。

  3. [編集] ボタンをクリックします。

  4. [挿入] タブの、[Web パーツ] ボタンをクリックします。

  5. [カテゴリ] で、[Custom] を選択します。

  6. Web パーツのリストで [ContextualTabWebPart] を選択し、[追加] をクリックします。

  7. Web パーツがページに追加されたら、ContextualTabWebPart Web パーツをクリックします。

  8. [Custom Contextual Tab Group] タブが表示されたことを確認してください。

関連項目

概念

Server リボン XML

Server リボンのページ コンポーネントを開発する

Server リボンの必須のカスタマイズ

Server リボンの宣言型カスタマイズ