четверг, 24 января 2013 г.

Преобразование текстового поля в кастомный лукап (lookup) CRM 2011
Возникла задача, согласно которой было необходимо, чтобы тип лукапа менялся в зависимости  от одного из полей CRM. Стандартный функционал CRM 2011 не позволяет реализовать данную функцию. Поиск в интернете показал два способа реализации, и оба работали некорректно на данной CRM. Возможно это связанно с какими-то конкретными особенностями установки, либо это просто глюк данной версии. 
Тем не менее, независимо от этого, задачу необходимо было выполнить, и поэтому было решено разработать свой способ преобразования.
1. Создаем обычное текстовое поле.
2. Создаем веб-ресурс, и добавляем его в нашу кастомизируемую сущность.
3. Редактируем веб-ресурс следующим образом:
Алгоритм следующий:
Во-первых, нам нужно получить ID сущности по ее названию.
Для этого добавляем фунцию  GetObjectTypeCode(entityName) , в качестве параметра выступает название сущности, а возвращает она ID.
Во-вторых, нужно хранить название сущности и ее идентификатор (так как наш кастомный лукап будет не серверным элементом, а клиентским, то будем хранить тип лукапа и идентификатор выбранной записи в скрытых полях).
При сохранении записи записываем значение лукапа в наше скрытое поле и сохраняем форму.
При открытии записи преобразовываем текстовое поле в лукап и записываем туда наше значение (если таковое имеется).
Все это будет хранится у нас в функции setCustomLookup()

var totalWorkflowCount =0;
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();
}


Комментариев нет:

Отправить комментарий