Для того, чтобы сделать это с помощью плагина вам может понадобиться использовать запрос RetrieveMultiple для той роли, которую пользователь может иметь и затем цикл через результаты, чтобы присвоить значение поля клиента на основе роли ...
Например, если у вас есть на fetchxml, чтобы получить роли, которые вы могли бы использовать его в плагин (вы можете использовать QueryExpression, а вместо fetchxml) ...
string FetchXML =
@"<fetch mapping='logical' count='50' version='1.0'>
<entity name='systemuser'>
<attribute name='fullname' />
<link-entity name='systemuserroles' from='systemuserid' to='systemuserid'>
<link-entity name='role' from='roleid' to='roleid'>
<attribute name='name' />
</link-entity>
</link-entity>
</entity>
</fetch>";
EntityCollection result = svcClient.OrganizationServiceProxy.RetrieveMultiple(new Microsoft.Xrm.Sdk.Query.FetchExpression(FetchXML));
// and then loop thru result
if (result != null)
{
foreach (var item in result.Entities) {
// ... do your stuff here
// item.roleName is just an idea.. I haven't tested the code yet..
Entity case = new Entity("case");
if (item.roleName == "role 01")
contact.Attributes["customer_field"] = "hard-code value 01";
if (item.roleName == "role 02")
contact.Attributes["customer_field"] = "hard-code value 02";
...
...
}
}
для этого конкретного сценария, я думаю вы можете достичь этого, используя только javascript. Если вы решили пойти именно так вот идея ...
Приложить яваскрипт функцию (Ex. autoFillCustomer()) в OnLoad случае формы, которая будет проверять имя роли и на основе результата она будет установите требуемое значение жесткого кодирования.
function autoFillCustomer(){
var roles = getAllUserRolesNames();
var customerField = Xrm.Page.getAttribute("customer_field");
for (var i = 0; i < roles.length; i++) {
var roleName = roles[i];
switch (roleName) {
case "Role Name 01":
if (customerField!= null)
customerFieldsetValue("hard-coded avlue 01");
break;
case "Role Name 021":
if (customerField!= null)
customerFieldsetValue("hard-coded avlue 02");
break;
default;
if (customerField!= null)
customerFieldsetValue("default value if needed");
}
}
}
А потом .. с другой стороны, вы можете иметь другой Js webresource с реализацией getAllUserRolesName() и добавить его в форму, а также. (это потому, что вы можете использовать его на новых будущих сценариев)
// Display Name: Get All User Roles Names
// Description: Returns an array containing all the roles and teams currently assigned to a user
// This will contain the name and not the guid which is what the standard getUserRoles() function does.
function getAllUserRolesNames() {
var guid = "[A-z0-9]{8}-[A-z0-9]{4}-[A-z0-9]{4}-[A-z0-9]{4}-[A-z0-9]{12}";
var serverUrl = Xrm.Page.context.getClientUrl();
var userId = Xrm.Page.context.getUserId();
userId = userId.match(guid);
var teamQuery = "TeamMembershipSet?$select=TeamId&$filter=SystemUserId eq guid'" + userId + "'";
var teamRoleQuery = "TeamRolesSet?$select=RoleId&$filter=";
var roleQuery = "RoleSet?$select=Name&$filter=";
var teams = makeRequest(serverUrl, teamQuery, 0);
teamRoleQuery = composeQuery(teamRoleQuery, "TeamId", teams);
var teamRoles = makeRequest(serverUrl, teamRoleQuery, 1);
userRoles = Xrm.Page.context.getUserRoles();
if (userRoles != null) {
for (var i = 0; i < userRoles.length; i++) {
teamRoles.push(userRoles[i].match(guid));
}
}
roleQuery = composeQuery(roleQuery, "RoleId", teamRoles);
var roles = makeRequest(serverUrl, roleQuery, 2);
return roles;
}
function makeRequest(serverUrl, query, type) {
var oDataEndpointUrl = serverUrl + "/XRMServices/2011/OrganizationData.svc/";
oDataEndpointUrl += query;
var service = GetRequestObject();
if (service != null) {
service.open("GET", oDataEndpointUrl, false);
service.setRequestHeader("X-Requested-With", "XMLHttpRequest");
service.setRequestHeader("Accept", "application/json, text/javascript, */*");
service.send(null);
var retrieved = $.parseJSON(service.responseText).d;
var results = new Array();
switch (type) {
case 0:
for (var i = 0; i < retrieved.results.length; i++) {
results.push(retrieved.results[i].TeamId);
}
break;
case 1:
for (var i = 0; i < retrieved.results.length; i++) {
results.push(retrieved.results[i].RoleId);
}
break;
case 2:
for (var i = 0; i < retrieved.results.length; i++) {
if (results.indexOf(retrieved.results[i].Name) == -1) {
results.push(retrieved.results[i].Name);
}
}
break;
}
return results;
}
return null;
}
function GetRequestObject() {
if (window.XMLHttpRequest) {
return new window.XMLHttpRequest;
} else {
try {
return new ActiveXObject("MSXML2.XMLHTTP.3.0");
} catch (ex) {
return null;
}
}
}
function composeQuery(queryBase, attribute, items) {
if (items != null) {
for (var i = 0; i < items.length; i++) {
if (i == 0) {
queryBase += attribute + " eq (guid'" + items[i] + "')";
} else {
queryBase += " or " + attribute + " eq (guid'" + items[i] + "')";
}
}
}
return queryBase;
}
Так что вы хотите, чтобы поле заполняться, как только открывается форма, или заполняется при сохранении формы? – Equalsk
Он должен заполняться, как только открывается форма. –