Преобразование лукапа в пиклист
Чтобы выбрать значение в лукапе нужно как минимум сделать два-три клика и открыть дополнительное окно. А чтобы выбрать значение в пиклисте нужно всего 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;
- Отключите прокрутку;
- Отключите границу.
Публикуем и идем смотреть…
Подскажите пожалуйста, почему при создании HTML ресурса, вставляю приведенный код, сохраняю, еще раз захожу в редактирование ресурса, а там с начала и до строки с СlientGlobalContext.js.aspx, а потом закрывающие теги для html-а и все 🙁 что за ограничение? Не подскажете?
1. Обошел это дело загрузкой файла в веб ресурс… но неужели так и должно быть?
2. Я конечно новичок и возможно в CRM везде так, но вот как выяснилось, «AccountSet,AccountId,Name» обязательно нужно писать с сохранением регистра. Я писал все маленькими буквами и не мог понять, почему не работает 🙁 Может стоит указать это в статье?
3. Подскажите, как скрыть поле? например «Валюта» или «Прайс-лист»? Ведь на них «замочек», да и я хочу что-бы это поле оставалось обязательным для заполнения :(…
1. Не совсем понимаю о чем речь 🙂
2. С опытом приходит (и в примере помоему правильно показано) 🙂
3. Не вижу логики: требования скрыть и оставить обязательным для заполнения слабо сочетаются 🙂
1. При заполнении веб-ресурса, через текстовый редактор, встроенный, веб ресурс почему-то «обрезается» после сохранения (если закрыть окно веб-ресурса и заново войти), до нескольких строк. А если загрузить в веб-ресурс файл с таким же текстом (хтмл) то все нормально.
2. ОК.
3. Как скрыть оригинальный лукап? и на его место поставить дроплист, такой же обязательный для заполнения, как был лукап. Или просто лукап прятать где-то внизу формы?
Можете подсказать по 3-му пункту?
И еще один вопрос:
Я сделал дропдаун для Основного контакта.
Подскажите пожалуйста, как в этом варианте выпадающего списка изменить запрос, который формируется для дропдауна, что бы в WebResource_primarycontactid выдавались только контакты текущей организации? Можете подсказать для примера?
1. Открыть редактор формы, открыть свойства лукапа и снять галку видимый по умолчанию.
2. Нужно в переменную
в конце добавить фильтер
Здравствуйте. Это сделано для какой версии CRM? У меня 2011-я, никак не могу заставить работать. В итоге на нём видно только «Загрузка…». Пробовал играться с регистрами имён полей, ни к чему не привело.
Здрасьте. Для 2011. Ну тут нужно отлаживать. Может уже эта версия не работает для вашего ролапа.