Кастомизация
11
Мар
7

Превьюшка для лукапа

Добавим к CRM интересную интерфейсную фичу – таблицу на основную форму объекта, в которую будут подтягиваться значения полей записи, выбранной в каком-либо лукапе.

Это будет так:

  • Создаем HTML Веб-ресурс с таким кодом:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    	<title>Lookup Preview</title>
    	<style type="text/css" media="screen">
            BODY { background: #f6f8fa; margin: 0; padding: 0 }
            table, td, th {border-color: #B0C4DE; border-style: solid }
            table { border-width: 0 0 1px 0; border-spacing: 0; border-collapse: collapse; width: 100%; text-align: left }
            td, th { padding: 6px; border-width: 1px 0 0 0; font: 11px Segoe UI, Serif }
            th { background-color: #e9edf1; font-weight: bold; width: 80px }
        </style>
        <script type="text/javascript" charset="utf-8">
            // Объявляем переменные
            b = window.parent;
            table = null; query = "";
            fields = []; values = [];
            lkpName = ""; lkpType = "";
    
            // Функция выполняемая при первоначальной загрузке
            function start() {
                var data = unescape(location.search.split("=")[1]).split("|");
                table = document.getElementById("main").firstChild;
    
                // Получаем имя лукапа и имя объекта
                var sField = data[0].split("=");
                lkpName = sField[0]; lkpType = sField[1];
                b.Xrm.Page.getAttribute(lkpName).addOnChange(oData);
    
                // Получаем список полей из переданных параметров
                var tFields = data[1].split(",");
                for (i = 0; i < tFields.length; i++) {
                    var lv = tFields[i].split("=");
                    fields[i] = lv[1];
    
                    // Формируем таблицу
                    var tr = document.createElement("tr");
                    var th = document.createElement("th");
                    th.innerText = lv[0];
                    var td = document.createElement("td");
                    tr.appendChild(th); tr.appendChild(td);
                    table.appendChild(tr);
    
                    // Формируем список полей для oData запроса
                    query += lv[1];
                    if (i + 1 != tFields.length) query += ",";
                }
                oData();
            }
    
            function oData() {
                // Получаем значение лукапа
                var lkpValue = b.Xrm.Page.getAttribute(lkpName).getValue();
                if (lkpValue != null)
                    var GUID = lkpValue[0].id;
                else {
                    reWrite(true);
                    return; // Если в лукапе ничего не выбрано - прекращаем выполнение
                }
    
                // Формируем URL для oData-запроса
                var serverURL = b.Xrm.Page.context.getServerUrl() + '/XRMServices/2011/OrganizationData.svc/' + lkpType + "Set(guid'" + GUID + "')?$select=" + query;
    
                // Отправляем запрос
                var getRequest = new b.XMLHttpRequest();
                getRequest.open("GET", serverURL, true);
                getRequest.setRequestHeader("Accept", "application/json");
                getRequest.setRequestHeader("Content-Type", "application/json; charset=utf-8");
                getRequest.onreadystatechange = function () { oDataCallBack(this); };
                getRequest.send(null);
            }
    
            // Выполняем разбор oData-запроса
            function oDataCallBack(retrievedData) {
                if (retrievedData.readyState == 4) {
                    if (retrievedData.status == 200) {
                        Data = b.JSON.parse(retrievedData.responseText).d;
                        for (i = 0; i < fields.length; i++)
                            values[i] = eval("Data." + fields[i]);
                        reWrite(false);
                    } else {
                        reWrite(true)
                        alert("Упс. Не получилось");
                    }
                }
            }
    
            // Помещаем данные в таблицу
            function reWrite(clear) {
                var trs = table.childNodes;
                for (var i = 0; i < trs.length; i++) {
                    var th = trs[i].childNodes[1];
                    if (clear)
                        th.innerText = "";
                    else
                        th.innerText = values[i];
                }
            }
        </script>
    </head>
    <body onload="start();">
        <table id="main"><tbody></tbody></table>    
    </body>
    </html>
    

    Логика тут такова:

  • При загрузке страницы вызываем функцию start, которая парсит переданные параметры и строит HTML-таблицу;
  • Далее переходим к функции oData, которая формирует URL oData-запроса и отправляет его;
  • Функция oDataCallBack обрабатывает результат oData-запроса;
  • Ну, и функция reWrite обновляет значение полей HTML-таблицы.
  • Подключаем Веб-ресурс к форме и передаем такую строку в параметрах:
    <имя_лукапа>=<имя_объекта_лукапа>|<заголовок1>=< имя_поля 1>,< заголовок2>=< имя_поля2>,< заголовок3>=< имя_поля3>

    Например, так:

    preferredsystemuserid=SystemUser|Имя=FirstName,Фамилия=LastName,Должность=Title

    Учтите только, что в качестве имени объекта и имен полей нужно передавать корректные Имена схемы (т.е. учитывать регистр).

Публикуем и идем играться…



Комментарии (7)
  • Владимир 11.03.2012

    Спасибо большое, что безвозмездно делитесь своими феноменальными наработками с общественностью!

  • Борис 11.03.2012

    Для мультилукапов, как, например, Получатель в Звонке, работать не будет, да?)

  • slivka_83 11.03.2012

    По идее должно работать только для первого значения:

    var GUID = lkpValue[0].id; 
    
  • Борис 11.03.2012

    Спасибо, все отлично работает, есть вопрос, возможно ли как-то перезагружать превьюху при изменении значения лукапа(кроме сохранения объекта на onChange() лукапа), а то значение лукапа может не соответствовать выводимой информации ???

  • slivka_83 11.03.2012

    По идее достаточно вызвать функцию oData из веб-ресурса.

  • Кирилл 11.03.2012

    Почему-то с кодировкой проблемы в заголовках полей…

  • slivka_83 11.03.2012

    Хм… странно… не встречал таких проблем в JS в CRM.

*

code