Преобразование текстового поля в кастомный лукап (lookup) CRM 2011
Возникла задача, согласно которой было необходимо, чтобы тип лукапа менялся в зависимости от одного из полей CRM. Стандартный функционал CRM 2011 не позволяет реализовать данную функцию. Поиск в интернете показал два способа реализации, и оба работали некорректно на данной CRM. Возможно это связанно с какими-то конкретными особенностями установки, либо это просто глюк данной версии.
Тем не менее, независимо от этого, задачу необходимо было выполнить, и поэтому было решено разработать свой способ преобразования.
1. Создаем обычное текстовое поле.
2. Создаем веб-ресурс, и добавляем его в нашу кастомизируемую сущность.
3. Редактируем веб-ресурс следующим образом:
Алгоритм следующий:
Во-первых, нам нужно получить ID сущности по ее названию.
Для этого добавляем фунцию GetObjectTypeCode(entityName) , в качестве параметра выступает название сущности, а возвращает она ID.
Во-вторых, нужно хранить название сущности и ее идентификатор (так как наш кастомный лукап будет не серверным элементом, а клиентским, то будем хранить тип лукапа и идентификатор выбранной записи в скрытых полях).
При сохранении записи записываем значение лукапа в наше скрытое поле и сохраняем форму.
При открытии записи преобразовываем текстовое поле в лукап и записываем туда наше значение (если таковое имеется).
Все это будет хранится у нас в функции setCustomLookup()
var plst ;
var PicklistName = "mrv_workflow_picklist";
var ChangefieldName = "mrv_workflow";
var EntityTypeField = "mrv_entitytype";
var PrimaryEntField = "mrv_entity";
var EntityLookup = "mrv_entitylookup";
var lookuptypeIcons = "/../_imgs/ico_16_4001.gif";
var EntityName = "mrv_entityname";
function GetObjectTypeCode(entityName)
{
/// <summary>
/// Gets the EntityTypeCode / ObjectTypeCode of a entity
/// </summary>
/// <param name="entityName" type="string">
/// Name of entity to return object type code of
/// </param>
/// <returns type="int" />
var lookupService = new RemoteCommand("LookupService","RetrieveTypeCode");
lookupService.SetParameter("entityName", entityName);
var result = lookupService.Execute();
if (result.Success && typeof result.ReturnValue == "number")
{
return result.ReturnValue;
}
else
{
return null;
}
}
function setWorkflowId()
{
// on Picklist change
var picklist = document.getElementById(PicklistName );
document.getElementById(ChangefieldName).value = picklist.value;
Xrm.Page.getAttribute(ChangefieldName).setValue(picklist.value);
document.getElementById(EntityLookup+"_ledit") .value = "";
document.getElementById(EntityLookup).setAttribute("lookuptypeIcons", lookuptypeIcons);
Xrm.Page.getAttribute(PrimaryEntField).setValue("");
Xrm.Page.getAttribute(EntityName).setValue("");
Xrm.Page.getAttribute(EntityLookup).setValue(null);
SDK.REST.retrieveRecord(picklist.value, "Workflow", "PrimaryEntity", null,SetEntityParams, function (error) { alert("error" +error.message); })
}
function setCustomLookup()
{
var lookupElement = document.getElementById(EntityLookup);
var EntName = document.getElementById(EntityTypeField).value;
var savedId = Xrm.Page.getAttribute(PrimaryEntField).getValue();
var savedType = EntName;
var savedName = Xrm.Page.getAttribute(EntityName).getValue();
var savedEntityName = EntName;
var lookuptypenames ='account';
var lookuptypes = '1';
if (EntName != '')
{
var lookuptypenames ="" + EntName;
var lookuptypes = "" + GetObjectTypeCode(EntName);
}
var lookuptypeIcons = "/../_imgs/ico_16_"+lookuptypes +".gif";
lookupElement.setAttribute("lookuptypes", lookuptypes);
lookupElement.setAttribute("lookuptypenames", lookuptypenames);
lookupElement.setAttribute("lookuptypeIcons", lookuptypeIcons);
lookupElement.setAttribute("defaulttype", lookuptypes); // default type - Lead entity
var originatingLeadValue = Xrm.Page.getAttribute(EntityLookup).getValue();
if(IsNull(originatingLeadValue) && (!IsNull(savedName)))
{
Xrm.Page.ui.controls.get(EntityLookup).setFocus();
document.getElementById(EntityLookup+"_ledit") .value = savedName;
lookupElement.fireEvent("onblur");
setTimeout( function() { setLookupValue(EntName,savedId,lookuptypes) }, 1000);
}
}
function onLookupChange()
{
var lookupElement = document.getElementById(EntityLookup);
var lkp = Xrm.Page.getAttribute("mrv_entitylookup").getValue();
if (!IsNull(lkp))
{
document.getElementById(PrimaryEntField).value =lkp[0].id;
Xrm.Page.getAttribute(EntityName).setValue(lkp[0].name);
Xrm.Page.getAttribute(PrimaryEntField).setValue(lkp[0].id);
}
}
function setLookupValue(name,id,typecode)
{
var baseNode = document.getElementById(EntityLookup+"_d").childNodes[0];
var FoundedLookupItem = new Object();
for (var i=0; i<baseNode.all.length;i++)
{
if (baseNode.all[i].id == "lookupItem")
{
FoundedLookupItem = baseNode.all[i];
}
}
FoundedLookupItem.title= name;
FoundedLookupItem.oid =id ;
FoundedLookupItem.otype = typecode;
FoundedLookupItem.category = "";
FoundedLookupItem.setAttribute("className","ms-crm-Lookup-Item");
var getElementsByClass = function(classList, node) {
var node = node || document,
list = node.getElementsByTagName('*'),
length = list.length,
classArray = classList.split(/\s+/),
classes = classArray.length,
result = [], i,j
for(i = 0; i < length; i++) {
for(j = 0; j < classes; j++) {
if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
result.push(list[i])
break
}
}
}
return result
}
var img = getElementsByClass('ms-crm-Lookup-Item',document.getElementById(EntityLookup+"_d").childNodes[0]);
img[1].src = "http://crm.spb.gkm/_imgs/ico_16_" + typecode + ".gif";
}
function onSave()
{
Xrm.Page.getAttribute(EntityLookup).setValue(null);
}
function onLoad()
{
setCustomLookup();
}