Кастомизация
12
Дек
2

Зависимые пиклисты

Задача: сделать так, чтобы в пиклисте Города отображались значения в зависимости от того, что выбрано в пиклисте Страны. Например:

  • Франция
    • Париж
    • Леон
    • Марсель
  • Великобритания
    • Лондон
    • Йорк
    • Бирмингем
  • Россия
    • Москва
    • Санкт-Петербург
    • Мурманск

Приступим:

  • Создайте два пиклиста и вынесите их на форму нужного объекта:
    • 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;
            }
        }
    }
}
Комментарии (2)
  • SVK 12.12.2011

    Коллеги, доброго дня!
    сделал первый вариант фильтрации.
    но выходит ошибка, например:

    событие: Onchange
    Ошибка: «france» не определено.

    скрипт копипастил.

  • slivka_83 12.12.2011

    Добрый день 🙂

    Проверю седня его…

*

code