今回はISV.config を拡張して、システムユーザのグリッドにボタンとアクションメニュー(その他の操作メニュー)に項目を追加し、拡張アプリケーションをダイアログ形式で表示するサンプルを掲載します。ISV.config を編集するので、クライアント拡張アプリケーションを有効にする必要があります。

拡張アプリケーションの有効方法はISV.config クライアント拡張を有効にする を参照。

確認環境

  • 動作環境:Windows Server 2003 , Dynamics CRM 4.0 IFD 構成
  • クライアント: IE 7
  • 開発環境:Visual Studio 2008 Professional
  • .NET 3.0

ISV.config の拡張処理は、システム管理者または、システムカスタマイザセキュリティロールのユーザで実行してください。

1. 作成アプリケーション

今回は、システムユーザの有効、無効をダイアログで設定する画面を作成します。ナヴィゲーションメニューの設定 → 管理 を選択し、管理メニューのユーザを選択して表示される下図の アクティブ設定 ボタンか、もしくは、その他の操作を選択して表示される有効無効画面 メニューを選択して画面を表示します。アクティブ設定 ボタン、 有効無効画面 メニューともに、ISV.config を編集して作成します。

 

 

表示されたダイアログで、リストで選択されたユーザの有効、無効を選択し、更新ボタンをクリックするとユーザの有効、無効を変更します。サンプルでは複数のユーザを選択しても、一人のステータスのみ変更されます。実装サボっただけですが。

2. 拡張アプリケーションの作成

まず、拡張ダイアログ用の画面を作成します。Visual Studio を起動し、Web アプリケーションプロジェクト(ここでは、DialogExtentionという名前にしています)を作成します。ターゲットは.NET 3.0 とします。

プロジェクトの参照の追加で、Dynamics CRM SDK の bin に格納されているmicrosoft.crm.sdk.dll と microsoft.crm.sdktypeproxy.dll を参照に追加します。また、プロジェクトに _img フォルダを作成し、同じくSDKの client / images フォルダにある、btn_rest.gif を作成した _img フォルダに格納します。

btn_rest.gif は Dynamics CRM で使用されているボタンと同じイメージです。

2.1 画面の作成

既定で作成される、Default.aspx を削除します。 web.config は、認証にWindows を指定されている箇所は、拡張アプリケーションとして配備するため不要となるので、以下のようにコメントアウトします。

<!--
    <authentication mode="Windows"/>
-->

ソリューションエクスプローラのプロジェクトを右クリックし、コンテキストメニューから追加→新しい項目を選択し、ControlIsDisabled.aspx というWeb フォームを作成します。

以下がControllsDisabled.aspx の中身です。参照している CSS ファイル、 style.css は後で作成します。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ControlIsDisabled.aspx.cs"
    Inherits="DialogExtention.ControlIsDisabled" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <base target="_self" />
    <title>ユーザの有効無効切り替え</title>
    <link rel="Stylesheet" href="style.css" type="text/css" />
    <script type="text/javascript">
        function window.onload() {
            var arrSystemUserIds = window.dialogArguments;
            if (arrSystemUserIds.length >= 1) {
                document.getElementById("hdnSystemUserId").value = arrSystemUserIds[0];
            }
        }
        function closeDialog() {
            try{
                window.close();
            } catch (e) {
                alert(e);
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div class="header">
    ユーザの有効無効を切り替える
    </div>
    <div class="content">
        <fieldset>
            <legend>個人情報</legend>
            <asp:RadioButtonList ID="rblEnableControl" runat="server">
                <asp:ListItem Enabled="true" Text="有効" Value="0" Selected="True" />
                <asp:ListItem Enabled="true" Text="無効" Value="1" />
            </asp:RadioButtonList>
        </fieldset>
        <asp:HiddenField runat="server" ID="hdnSystemUserId" />
    </div>
    <div class="footer">
        <asp:Button runat="server" ID="btnOK" class="button" Text="更新" />
        <asp:Button runat="server" ID="btnCancel" class="button" Text="閉じる" OnClientClick="closeDialog(); return false;" />
    </div>
    </form>
</body>
</html>

コードビハインドファイル ControlIsDisabled.aspx.cs は次のようになっています。ポストバックが発生時にラジオボタンの中で有効、無効が設定された内容で、CRMユーザの有効、無効を設定するようにしています。

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Win32;

namespace DialogExtention
{
    public partial class ControlIsDisabled : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                if (!string.IsNullOrEmpty(hdnSystemUserId.Value))
                {
                    using (new CrmImpersonator())
                    {
                        CrmService service = GetCrmServiceFromRegistry(Request.QueryString["orgName"]);
                        Guid systemUserId = new Guid(hdnSystemUserId.Value);
                        SetStateSystemUserRequest request = new SetStateSystemUserRequest();
                        request.EntityId = systemUserId;
                        request.SystemUserStatus = -1;
                        if (rblEnableControl.SelectedValue == "0")
                        {
                            request.SystemUserState = SystemUserState.Active;
                        }
                        else
                        {
                            request.SystemUserState = SystemUserState.Inactive;
                        }

                        SetStateSystemUserResponse response = (SetStateSystemUserResponse) service.Execute(request);
                        ClientScript.RegisterStartupScript(this.Page.GetType(), "close", "closeDialog();", true);
                    }
                }
            }
        }
        public CrmService GetCrmServiceFromRegistry(string orgName)
        {
            CrmAuthenticationToken token;
            token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, orgName);
            token.OrganizationName = orgName;
            //token.AuthenticationType = 0; //AD   

            //Create the Service   
            CrmService service = new CrmService();
            service.Credentials = System.Net.CredentialCache.DefaultCredentials;
            service.CrmAuthenticationTokenValue = token;
            // レジストリで取得されるホスト名で接続する場合、ホスト名のIPアドレス   
            // がIFD構成(フォーム認証)が必要な場合は、DiscoveryService を使用して、   
            // 認証トークンを作成する必要があるので注意   
            service.Url = GetCrmServiceUrlFromRegitry() + "/2007/CrmService.asmx";
            // localhostの場合はOn-Premise   
            service.Url = "http://localhost/MSCRMServices/2007/CrmService.asmx";

            return service;
        }
        private static string GetCrmServiceUrlFromRegitry()
        {
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MSCRM"))
            {
                if (key != null)
                {
                    string url = (string)key.GetValue("ServerUrl");
                    if (!string.IsNullOrEmpty(url)) return url;
                }
            }
            return string.Empty;
        } 
    }
}

2.2 スタイルシートの作成

画面で使用するスタイルシートを作成します。ソリューションエクスプローラ上のWebアプリケーションを右クリックし、コンテキストメニューの 追加→新しい項目 でスタイルシートファイル style.css を作成します。

スタイルシートstyle.cssは次の設定しています。

/* SDK付属のcrm4 ux design guide.pdfを元に作成 */
body
{
	background-color:#EAF3FF;
	font-family:Tahoma;
}

.footer
{
	text-align:right;
}
.button
{
	font-family:Tahoma;
	font-size:11px;
	line-height:18px;
	height:22px;
	width:84px;
	text-align:center;
	cursor:pointer;
	border:1px #3366CC solid;
	background-color:#CEE7FF;
	background-image:url(_img/btn_rest.gif);
	background-repeat:repeat-x;
}

以上でアプリケーションの作成は完了です。

2.3 アプリケーションの配備

作成したWebアプリケーションを配備します。ソリューションエクスプローラ上でプロジェクトを右クリック→発行 を選択して、Dynamics CRM アプリケーションのインストールフォルダのルート/ISV/Handcraft/EnableDisableUser フォルダに発行します。bin フォルダが作成されるので、作成されたDialogExtention.dll をDynamics CRM アプリケーションのルート/bin フォルダにコピーします。

以上で配備は完了です。次に、ISV.config を編集して、ユーザのリスト画面にボタンとメニュー項目を追加します。

3. ユーザリスト画面へのボタン、メニュー項目の追加

ISV.config を使用してユーザリスト画面へのボタン、メニュー項目を追加します。追加イメージは、1.作成アプリケーション を参照してください。

3.1 ISV.config のエクスポート

ナヴィゲーションメニューの設定→カスタマイズ画面を表示し、カスタマイズ画面でカスタマイズのエクスポートを選択します。

ISV.config をダウンロードするので、ビュードロップダウンでクライアント拡張を選択します。絞り込んだリストからISV Config を選択して、メニューの選択したカスタマイズのエクスポートを選択します。

ダウンロード画面が表示されるので、保存ボタンをクリックして、customizations.zip をローカルフォルダにダウンロードします。

3.2 ISV.config の編集

ダウンロードしたcustomize.zip を解凍し、customize.xml を編集します。編集箇所は Entities 要素の子要素として、次の要素を追加します。

<Entity name="systemuser">
   <Grid>
       <MenuBar>
          <ActionsMenu>
              <MenuItem Url="/ISV/Handcraft/EnableDisableUser/ControlIsDisabled.aspx" WinMode="1" WinParams="dialogWidth:250px;dialogHeight:150px" PassParams="1" >
	          <Titles>
          	    <Title LCID="1041" Text="有効無効画面" />
     	          </Titles>
      	      </MenuItem>
          </ActionsMenu>
          <Buttons>
              <Button Icon="" Url="/ISV/Handcraft/EnableDisableUser/ControlIsDisabled.aspx"
			WinMode="2" WinParams="dialogWidth:250px;dialogHeight:150px" PassParams="1">
                  <Titles>
                    <Title LCID="1041" Text="アクティブ設定" />
                  </Titles>
              </Button>
          </Buttons>
       </MenuBar>
   </Grid>
</Entity>

ユーザエンティティの画面を拡張するため、name は systemuser にしています。ActionMenuとButtons 要素に、拡張アプリケーションを呼び出すためのメニュー項目と、Button を追加しています。 各要素の説明は SDK を参照するとわかります。簡単に説明するとUrl は拡張アプリケーションのURL のパスです。WinMode は0:ページとして表示、1:モーダルダイアログとして表示,2:モードレスダイアログとして表示するかを指定し、PassParamは1にすると、組織情報などの情報をクエリパラメタとして渡してくれるようにしてくれます。Titleは日本語の言語コード1041を指定して日本語用のタイトルを設定しています。WinParams は画面表示のパラメータです。javascriptのShowModalDialog,ShowModelessDialog を参照してください。

クライアント拡張のためのISV.configの編集方法については、Dynamics CRM SDK のヘルプのルートから
Microsoft Dynamics CRM SDK → クライアント拡張およびスクリプト → クライアント拡張コントロールの追加 → 統合ポイント
が参考になります。

3.3 ISV.config のインポート

編集したcustomize.xmlをインポートします。ナヴィゲーションメニューの設定→カスタマイズを選択します。カスタマイズ画面からカスタマイズのインポートを選択します。

カスタマイズのインポート画面で参照で、編集したcustomize.xml を選択し、アップロードボタンでファイルをアップロードします。アップロードが成功すると、リストにISV Config という表示名で表示されます。ボタンのセンタk吹田カスタマイズのインポートを選択します。

インポートが成功すると、表示されたダイアログのOKボタンがクリックできるようになるので、OKボタンをクリックしてインポート処理を完了します。

以上でISV.config のカスタマイズとインポート処理が完了しました。

4. まとめ

以上で処理は説明は終了です。ナヴィゲーションメニューの設定→管理を選択して管理画面からユーザをクリックすると、ユーザ画面で拡張ボタン、メニューが表示されるようになっています。1.作成アプリケーションの画面イメージのように拡張ボタンをクリックしてダイアログを表示できるようになっています。

拡張ボタン、メニュー項目が表示されない場合は、Webページのクライアント拡張が有効になっている確認してください。クライアント拡張が有効にする方法は、[DynamicsCRM] SV.config クライアント拡張を有効にする を参照してください。