Dynamics CRM 2011 Xrm.Page サンプルライブラリ紹介 その 6

みなさん、こんにちは。

今回は Xrm.Page.context オブジェクトのサンプルを紹介していきます。

サンプルを確認するにあたり準備があるため、こちらの記事
ご覧いただき、サンプルのインストールを行ってください。

Xrm.Page.contextオブジェクト

サンプルの前に、Xrm.Page.context オブジェクトを簡単に説明します。
Xrm.Page オブジェクトモデルでは、UI とデータの操作を行えますが、
現在フォームを開いているユーザー等の情報も取得可能です。

よって WhoAmI リクエストやセキュリティロールの取得を別途する
必要がありません。またコンテキスト情報をそのままスクリプトの
引数として渡すことも可能です。

サンプル紹介

今回紹介するサンプルは、以下のフォルダにあります。
SDK\SampleCode\JS\FormScripts\SDK.ContextSamples.js

実行ユーザー情報の取得

現在フォームを開いているユーザーの情報を取得するサンプルです。

[getOrgAndUserInfo 関数]
ユーザーが所属する組織の情報を取得します。現在開発中の環境と
本番が異なる等、組織名をハードコードできない場合に利用します。

getOrgAndUserInfo: function ()
{
    // Xrm.Page.context の getOrgUniqueName メソッドで
    // 組織名を取得
    var orgName = Xrm.Page.context.getOrgUniqueName();
    var message = "The current Organization Name is '" + orgName + "'.\n";

    // 組織の言語を取得
    var orgLcid = Xrm.Page.context.getOrgLcid();
    message += "The current Organization Language Code Id is '" + orgLcid + "'.\n";

    // ユーザーの言語を取得
    var currentUserLcid = Xrm.Page.context.getUserLcid();
    message += "The current user's Language Code Id is '" + currentUserLcid + "'.";
        alert(message);
},

[isUserSysAdmin 関数]
現在のユーザーロールがシステム管理者であるか確認します。
現在のユーザーのロールは Xrm.Page.context から取得していますが
システム管理者ロールの GUID を取得するために REST エンドポイント
を利用しています。

isUserSysAdmin: function ()
{
    // Xrm.Page.context オブジェクトの getServerUrl メソッドでサーバーの
    // URL を取得しています。
    var serverUrl = Xrm.Page.context.getServerUrl();
    // セキュリティロール名が System Administrator であるセキュリティロールを
    // 取得する OData クエリを作成します。
    // ※日本語環境の場合セキュリティロール名が System Administrator では
// ※無いため、既存のコードはコメントアウトして、変わりのコードを
// 追加しています。
    // var query = "/XRMServices/2011/OrganizationData.svc/RoleSet?$top=1&$filter=Name eq 'System Administrator'&$select=RoleId";

    // システム管理者という文字列を URL エンコード
    var SystemAdminName = encodeURI("システム管理者");
    var query = "/XRMServices/2011/OrganizationData.svc/RoleSet?$top=1&$filter=Name eq '" + SystemAdminName + "'&$select=RoleId";

    // REST へのリクエストを作成、送信
    var retrieveRoleRequest = new XMLHttpRequest();
    retrieveRoleRequest.open("GET", serverUrl + query, true);
    retrieveRoleRequest.onreadystatechange = function ()
    {
        // retrieveRoleResponse サンプル関数をコールバックとして渡す
        SDK.ContextSamples.retrieveRoleResponse(this);
    };
    retrieveRoleRequest.send();
},

[retrieveRoleResponse 関数]
上記関数のコールバック関数。システム管理者セキュリティーロールの
GUID を取得して、現在のユーザーのものと比較します。

retrieveRoleResponse: function (retrieveRoleRequest)
{
    if (retrieveRoleRequest.readyState == 4)
    {
        if (retrieveRoleRequest.status == 200)
        {
            var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.6.0")
            xmlDoc.async = false;
            xmlDoc.loadXML(retrieveRoleRequest.responseText);
            // システム管理者の GUID を確認
            var sysAdminRoleId = xmlDoc.selectSingleNode("//*[local-name() = 'RoleId']").text
            // Xrm.Page.context の getUserRoles メソッドで、現在のユーザーに
            // 与えられているセキュリティロール一覧を取得
            var currentUserRoles = Xrm.Page.context.getUserRoles();
            for (var i = 0; i < currentUserRoles.length; i++)
            {
                var userRole = currentUserRoles[i];
                if (userRole == sysAdminRoleId)
                {
                    alert("The current user has the 'System Administrator' role.");
                    return;
                }
            }
            alert("The current user does not have the 'System Administrator' role.");
        }
        else
        {
            //handle error
            alert("Error retrieving user Roles");
        }
    }
},

[isCurrenUserRecordOwner 関数]
レコードの所有者と現在のユーザーが同一か確認しています。

isCurrenUserRecordOwner: function ()
{
    // Xrm.Page.context の getUserId メソッドで現在のユーザー ID を取得
    var currentUserId = Xrm.Page.context.getUserId();
    // Xrm.Page.data.entity.attributes の get メソッドで OwnerId 列を取得
    var ownerIdAttribute = Xrm.Page.data.entity.attributes.get("ownerid");

    if (ownerIdAttribute != null)
    {
        // getValue メソッドで、OwnerId 列の値を取得
        var ownerIdValue = ownerIdAttribute.getValue();
        if (ownerIdValue != null && ownerIdValue.length == 1)
        {
            // 現在のユーザー ID と比較
            if (currentUserId == ownerIdValue[0].id)
            {
                alert("The current user is the owner of this record.");
            }
            else
            {
                alert("The current user is not the owner of this record.");
            }
        }
        else
        {
            alert("The ownerid field does not currently have a value.");
        }
    }
    else
    {
        alert("The ownerid field is not on the current form.");
    }
},

開いているフォームの情報取得サンプル

Xrm.Page.context では、実行ユーザーだけでなくフォーム自体の情報も
取得することが可能です。

[getQueryStringParams 関数]
フォームの URL よりクエリ文字列を取得します。

getQueryStringParams: function ()
{
    // Xrm.Page.context の getQueryStringParameters メソッドでクエリ文字列を取得
    var queryStringParams = Xrm.Page.context.getQueryStringParameters();
    var paramsMessage = "";

    for (var i in queryStringParams)
    {
        paramsMessage += "\n" + i + ": " + queryStringParams[i];
    }
    alert("The current query string parameters are:\n" + paramsMessage);
}

まとめ

全 6 回で Xrm.Page オブジェクトモデルのサンプルを紹介してきましたが
いかがだったでしょうか。スクリプトを利用すれば様々な処理が可能ですが、
常にパフォーマンスやセキュリティを考慮して実装を行ってください。

Xrm.Page オブジェクトで提供される情報を REST エンドポイントなどで無駄に
取得していないかや、処理の一部はプラグイン、ワークフローとして実装した
方が無駄がないか等、検討事項は多々あります。

またコントロールやセクションの表示、非表示に関しても、フォームレベルで
分離する方法やフィールドレベルセキュリティを活用することも可能です。
色々お試しください。

- Dynamics CRM サポート 中村 憲一郎