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 サポート 中村 憲一郎
Comments
- Anonymous
February 14, 2017
DCRM2011(UR18)で、システム管理者(administrator)で実行時、getUserRoles() の戻り値に、付与されていないセキュリティロールの情報が含まれてきます。その他のユーザ何人かで試したのですが、先述の事象が発生するのはシステム管理者のみでした。影響する設定等、もし何か情報お持ちでしたらご教示頂けないでしょうか。よろしくお願いいたします。- Anonymous
February 14, 2017
すみません。自己解決しました。システム管理者には、チームが設定されており、そのチームに付与されているセキュリティロールが返却されてきている様です。お騒がせしました。
- Anonymous