Зависимые пиклисты
Задача: сделать так, чтобы в пиклисте Города отображались значения в зависимости от того, что выбрано в пиклисте Страны. Например:
- Франция
- Париж
- Леон
- Марсель
- Великобритания
- Лондон
- Йорк
- Бирмингем
- Россия
- Москва
- Санкт-Петербург
- Мурманск
Приступим:
- Создайте два пиклиста и вынесите их на форму нужного объекта:
- new_country, со значениями:
- Франция — 100 000 000
- Великобритания — 100 000 001
- Россия — 100 000 002
- new_city, со значениями:
- Париж — 100 000 000
- Леон — 100 000 001
- Марсель — 100 000 002
- Лондон — 100 000 003
- Йорк — 100 000 004
- Бирмингем — 100 000 005
- Москва — 100 000 006
- Санкт-Петербург — 100 000 007
- Мурманск — 100 000 008
- Создайте Веб-ресурс new_dependoptionset.js с таким содержимым:
if (typeof (Sample) == "undefined") { Sample = {}; } Sample.DependOptionSet = { filterDependentField: function (picklist, valuelist) { var optionset = Xrm.Page.ui.controls.get(picklist); // Получаем ссылку на зависимый пиклист optionset.clearOptions(); // Полностью очищаем пиклист // Просматриваем список нужных значений и заносим в зависимый пиклист for (var item in valuelist) optionset.addOption(valuelist[item]); } }
Функция filterDependentField по сути и производи фильтрацию – без привязки к контексту – что и где фильтровать задается вне ее. Функция принимает два параметра: имя пиклиста, в котором необходимо производить фильтрацию и список значений, которые должны отображаться в пиклисте в «текущий» момент. При вызове этой функции, пиклист, чье имя передано в качестве параметра, полностью очищается. Затем значения переданные во втором параметре заносятся в пиклист.
- Создайте Веб-ресурс new_xObject.js с таким содержимым:
if (typeof (Sample) == "undefined") { Sample = {}; } Sample.x = { onLoad: function () { // Определяем отдельные наборы значений подчиненного пиклиста france = [ { "text": "Париж", "value": "100000000" }, { "text": "Леон", "value": "100000001" }, { "text": "Марсель", "value": "100000002" } ]; britan = [ { "text": "Лондон", "value": "100000003" }, { "text": "Йорк", "value": "100000004" }, { "text": "Бирмингем", "value": "100000005" } ]; russia = [ { "text": "Москва", "value": "100000006" }, { "text": "Санкт-Петербург", "value": "100000007" }, { "text": "Мурманск", "value": "100000008" }, ]; // Запоминаем текущее значение поиклиста на onLoad'е var curTypeValue = Xrm.Page.getAttribute('new_city').getValue(); // Выполняем фильтрацию значений this.f_new_country(); // Возвращаем текущее значение Xrm.Page.getAttribute('new_city').setValue(curTypeValue); }, f_new_country: function () { // В зависимости от значения основного пиклиста фильтруем дочерний пиклист switch (Xrm.Page.getAttribute('new_country').getValue()) { case 100000000: Sample.DependOptionSet.filterDependentField('new_city', france); break case 100000001: Sample.DependOptionSet.filterDependentField('new_city', britan); break case 100000002: Sample.DependOptionSet.filterDependentField('new_city', russia); break } } }
Здесь мы объявляем две функции:
- Первая будет вызываться на онлоаде и в самом начале определять в отдельных переменных отдельные наборы значений зависимого пиклиста. Затем запоминается текущее значение зависимого пиклиста и вызывается вторая функция (из этого Веб-ресурса), которая производит фильтрацию значений зависимого пиклиста. И последним шагом возвращается текущее значение пиклиста (которое было при загрузке). Последние действия нужны поскольку при фильтрации полностью очищаются все значения пиклиста и соответственно если этого не далать, то на онлоаде текущее сохраненное значение будет сбрасываться;
- Вторая функция будет вызываться при изменении значений пиклиста Страна и в зависимости от текущего выбранного значения будет вызывать функцию фильтрации и передавать ей нужный «набор» зависимого пиклиста.
- Прикрепите к форме нужного объекта оба созданных JS Веб-ресурса. На онлоад формы повесьте вызов функции Sample.x.onLoad, а на ончейндж пиклиста Страна повесьте вызов функции Sample.x.f_new_category.
Идем тестировать…
Другой вариант фильтрации
function filterOptionSet(businessUnitName) { // Поулчаем набор текущих значений пиклиста var OptionSet = Xrm.Page.ui.controls.get("sc_optionset"); var OptionSetValues = OptionSet.getAttribute().getOptions(); // Определяем возможные массивы значений var BU1 = new Array(1, 2, 3, 7, 8, 9, 12); var BU2 = new Array(2, 3, 4, 9); var BU3 = new Array(5, 6, 9, 12); var optionSetArray = new Array(); // Определяем какой массив нам нужен в данный момент switch (businessUnitName) { case "BU1": optionSetArray = BU1; break; case "BU2": optionSetArray = BU2; break; case "BU3": optionSetArray = BU3; break; default: return; break; } // Удаляем из пиклиста значения не заданные в массиве значений for (var optionCounter = 0; optionCounter < optionSetValues.length; optionCounter++) { for (var arrayCounter = 0; arrayCounter < optionSetArray.length; arrayCounter++) { if (optionSetValues[optionCounter].value.trim() == optionSetArray[arrayCounter]) { optionSetArray.removeOption(optionSetValues[optionCounter].value); break; } } } }
Коллеги, доброго дня!
сделал первый вариант фильтрации.
но выходит ошибка, например:
событие: Onchange
Ошибка: «france» не определено.
скрипт копипастил.
Добрый день 🙂
Проверю седня его…