Расширенная функциональность
25
Авг
8

Преобразование лукапа в пиклист

Чтобы выбрать значение в лукапе нужно как минимум сделать два-три клика и открыть дополнительное окно. А чтобы выбрать значение в пиклисте нужно всего 2 клика. И если Вам лень пользоваться лукапом, посмотрим как преобразовать лукап в пиклист.

  • Создайте JS Веб-ресурс из jQuery 1.8.0;
  • Добавьте лукап на форму. Сделайте его невидимым (я для наглядности не стал этого делать);
  • Создайте HTML Веб-ресурс с таким кодом:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
        <head>
            <title></title>
            <script src="ClientGlobalContext.js.aspx" type="text/javascript" ></script>
            <script src="/WebResources/new_jquery1.8.0.min.js" type="text/javascript"></script>        
            <script type="text/javascript">
                $(document).ready(function () {
                    var context = GetGlobalContext();
                    var params = context.getQueryStringParameters();
    
                    // Получаем переменные из строки запроса
                    var dataParam = params.data.split(",");
                    var lookupEntitySetName = dataParam[0];
                    var lookupEntityIdFieldName = dataParam[1];
                    var lookupEntityDisplayFieldName = dataParam[2];
                    var nameOfLookupFieldOnForm = dataParam[3];
                    var webResourceName = dataParam[4];
    
                    // Формируем запрос
                    var oDataQuery = context.getServerUrl() + "/XRMServices/2011/OrganizationData.svc" + "/" + lookupEntitySetName + "?$select=" + lookupEntityIdFieldName + "," + lookupEntityDisplayFieldName;
                    var lookupAttribute = window.parent.Xrm.Page.getAttribute(nameOfLookupFieldOnForm);
                    var lookupArray = lookupAttribute.getValue();
    
                    // Просматриваем результат запроса
                    $.getJSON(oDataQuery, function (data) {
                        var results = data.d.results;
                        var lookupdropdown = $("#lookupdropdown");
    
                        // Подставляем значения в пиклист
                        for (var i = 0; i < results.length; i++) {
                            var option = "<option value='" + results[i][lookupEntityIdFieldName];
                            option += "'>" + results[i][lookupEntityDisplayFieldName] + "</option>";
                            lookupdropdown.append(option);
                        }
    
                        lookupdropdown.prepend("<option value='blank'></option>");
    
                        if (lookupArray) {
                            var lookupId = lookupArray[0].id.replace("{", "").replace("}", "").toLowerCase();
                            lookupdropdown.val(lookupId);
                        } else {
                            lookupdropdown.val("blank");
                        }
    
                        $("#lookupdropdown option[value='Loading...']").remove();
                        lookupdropdown.width("100%");
    
                        // При изменении значения в пиклисте, подставляем соответствующее значение в стандртный лукап
                        lookupdropdown.change(function () {
                            var name = $("#lookupdropdown option:selected").text();
                            if (name == "") {
                                SetLookupValueToNull(nameOfLookupFieldOnForm);
                            } else {
                                var entityType = results[0].__metadata.type.replace("Microsoft.Crm.Sdk.Data.Services.", "");
                                SetLookupValue(nameOfLookupFieldOnForm, lookupdropdown.val(), name, entityType);
                            }
                        });
                    });
    
                    // Если лукап обязательный, то добавляем на сохранение проврерку, выбрано ли значение в пиклисте
                    var requiredLevel = lookupAttribute.getRequiredLevel();
                    if (requiredLevel == "required") {
                        lookupAttribute.setRequiredLevel("none");
                        var label = $("label[for='" + webResourceName + "']", window.parent.document);
                        label.append("<IMG class=ms-crm-ImageStrip-frm_required alt=Required src='/_imgs/imagestrips/transparent_spacer.gif?ver=600790655'>");
    
                        window.parent.Xrm.Page.data.entity.addOnSave(function (context) {
                            var name = $("#lookupdropdown option:selected").text();
                            if (name == "") {
                                var labelForWebResource = window.parent.Xrm.Page.getControl(webResourceName).getLabel();
                                alert("Вы должны выбрать значение в " + labelForWebResource + ".");
                                context.getEventArgs().preventDefault();
                            }
                        });
                    }
                });
    
                // Функция заполняет стандартный лукап
                function SetLookupValue(fieldName, id, name, entityType) {
                    if (fieldName != null) {
                        var lookupValue = new Array();
                        lookupValue[0] = new Object();
                        lookupValue[0].id = id;
                        lookupValue[0].name = name;
                        lookupValue[0].entityType = entityType;
    
                        window.parent.Xrm.Page.getAttribute(fieldName).setValue(lookupValue);
                    }
                }
    
                // Функция обнуляет стандартный лукап
                function SetLookupValueToNull(fieldName) {
                    if (fieldName != null) {
                        window.parent.Xrm.Page.getAttribute(fieldName).setValue(null);
                    }
                }
            </script>
            <link href="/_common/styles/fonts.css.aspx?lcid=1033" rel="stylesheet" type="text/css"/>
            <link href="/_common/styles/global.css.aspx?lcid=1033" rel="stylesheet" type="text/css"/>
            <link href="/_common/styles/select.css.aspx?lcid=1033" rel="stylesheet" type="text/css"/>
        </head>
        <body style="background-color: rgb(246, 248, 250); border-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-left: 0px; padding-top: 0px;">
            <select id="lookupdropdown" class="ms-crm-SelectBox">
                <option value="Loading..." selected="selected">Загрузка...</option>
            </select>
        </body>
    </html>
    
  • Добавьте HTML Веб-ресурс на форму со следующими настройками:
    • Отобразите метку (задайте ее аналогично скрываемому лукапу);
    • Снимите галку ограничивающую использование скриптов
    • В Custom Parameter(data) поместите через запятую такие параметры:
      lookupEntitySetName,lookupEntityIdFieldName,lookupEntityDisplayFieldName,nameOfLookupFieldOnForm,webResourceName

      Их расшифровка:

      • lookupEntitySetName – имя объекта + «set» (для формирования запроса с помощью Odata);
      • lookupEntityIdFieldName – имя основного атрибута объекта лукапа;
      • lookupEntityDisplayFieldName – имя поля из лукапа (т.е. объекта, который он представляет) которое необходимо вывести в пиклисте;
      • nameOfLookupFieldOnForm –имя лукапа (которое скрыто на форме);
      • webResourceName – имя Веб-ресурса на форме.

      Например:

      AccountSet,AccountId,Name,parentaccountid,WebResource_dropdown
    • На вкладке форматирования:
      • Один столбец;
      • Число строк = 1;
      • Отключите прокрутку;
      • Отключите границу.

Публикуем и идем смотреть…



Комментарии (8)
  • Игорь 25.08.2012

    Подскажите пожалуйста, почему при создании HTML ресурса, вставляю приведенный код, сохраняю, еще раз захожу в редактирование ресурса, а там с начала и до строки с СlientGlobalContext.js.aspx, а потом закрывающие теги для html-а и все 🙁 что за ограничение? Не подскажете?

  • Игорь 25.08.2012

    1. Обошел это дело загрузкой файла в веб ресурс… но неужели так и должно быть?
    2. Я конечно новичок и возможно в CRM везде так, но вот как выяснилось, «AccountSet,AccountId,Name» обязательно нужно писать с сохранением регистра. Я писал все маленькими буквами и не мог понять, почему не работает 🙁 Может стоит указать это в статье?
    3. Подскажите, как скрыть поле? например «Валюта» или «Прайс-лист»? Ведь на них «замочек», да и я хочу что-бы это поле оставалось обязательным для заполнения :(…

  • slivka_83 25.08.2012

    1. Не совсем понимаю о чем речь 🙂
    2. С опытом приходит (и в примере помоему правильно показано) 🙂
    3. Не вижу логики: требования скрыть и оставить обязательным для заполнения слабо сочетаются 🙂

  • Игорь 25.08.2012

    1. При заполнении веб-ресурса, через текстовый редактор, встроенный, веб ресурс почему-то «обрезается» после сохранения (если закрыть окно веб-ресурса и заново войти), до нескольких строк. А если загрузить в веб-ресурс файл с таким же текстом (хтмл) то все нормально.
    2. ОК.
    3. Как скрыть оригинальный лукап? и на его место поставить дроплист, такой же обязательный для заполнения, как был лукап. Или просто лукап прятать где-то внизу формы?

  • Игорь 25.08.2012

    Можете подсказать по 3-му пункту?
    И еще один вопрос:
    Я сделал дропдаун для Основного контакта.
    Подскажите пожалуйста, как в этом варианте выпадающего списка изменить запрос, который формируется для дропдауна, что бы в WebResource_primarycontactid выдавались только контакты текущей организации? Можете подсказать для примера?

  • slivka_83 25.08.2012

    1. Открыть редактор формы, открыть свойства лукапа и снять галку видимый по умолчанию.
    2. Нужно в переменную

     
    var oDataQuery 
    

    в конце добавить фильтер

    $filter=ParentCustomerId/Id eq (guid'" + Xrm.Page.data.entity.getId() + "')";
    
  • Алексей 25.08.2012

    Здравствуйте. Это сделано для какой версии CRM? У меня 2011-я, никак не могу заставить работать. В итоге на нём видно только «Загрузка…». Пробовал играться с регистрами имён полей, ни к чему не привело.

  • slivka_83 25.08.2012

    Здрасьте. Для 2011. Ну тут нужно отлаживать. Может уже эта версия не работает для вашего ролапа.

*

code