Кастомизация
22
Янв
2

Мульти-пиклист для CRM 2011

Рассмотрим очередную «миграцию» старого фишек в CRM 2011. На этот раз будем создавать мульти-пиклист для CRM 2011:

  • Создайте:
    • Пиклист для какого-либо объекта CRM (или можете использовать уже существующий) – из его значений будет создавать мульти-писклист;
    • Однострочное текстовое поле – оно будет использоваться для хранения значений, выбранных в мульти-пиклисте.

    Оба поля вынесите на форму, при этом текстовое поле скройте.

  • Создайте JS Веб-ресурс с таким кодом:
    // Конвертируем обычный пиклист в мульти-писклист
    function createMultiSelect(picklist, valueHolder) {
        var PL = eval("document.all." + picklist);
        var PLV = eval("document.all." + valueHolder);
        PL.style.display = "none";
    
        // Создаем DIV контейнер
        var addDiv = document.createElement("<div style='overflow-y:auto; border:1px #6699cc solid; background-color:#ffffff; padding: 2px 0px' />");
        PL.parentNode.appendChild(addDiv);
    
        // Создаем чекбоксы
        for (var i = 1; i < PL.options.length; i++) {
            var option = PL.options[i];
            if (!IsChecked(option.text, PLV))
                var addInput = document.createElement("<input type='checkbox' style='border:none; width:25px; align:left;' />");
            else
                var addInput = document.createElement("<input type='checkbox' checked='checked' style='border:none; width:25px; align:left;' />");
    
            var addLabel = document.createElement("<label />");
            addLabel.innerText = option.text;
    
            var addBr = document.createElement("<br/>");
    
            PL.nextSibling.appendChild(addInput);
            PL.nextSibling.appendChild(addLabel);
            PL.nextSibling.appendChild(addBr);
        }
    }
    
    // Проверяем какие значения в мульти-пиклесте была ранее выбраны
    function IsChecked(pText, PLV) {
        if (PLV.value != "") {
            var PLVT = PLV.value.split(";");
            for (var i = 0; i < PLVT.length; i++) {
                if (PLVT[i] == pText)
                    return true;
            }
        }
        return false;
    }
    
    // Сохраняем значения выбранные в мульти-пиклисте
    function saveMultiSelect(picklist, valueHolder) {
        var PL = eval("document.all." + picklist);
        var getInput = PL.nextSibling.getElementsByTagName("input");
        var result = '';
    
        for (var i = 0; i < getInput.length; i++) {
            if (getInput[i].checked) {
                result += getInput[i].nextSibling.innerText + ";";
            }
        }
    
        Xrm.Page.getAttribute(valueHolder).setValue(result);
    }
    

    В этом коде три функции:

    • createMultiSelect – создает мульти-пиклист на основе существующего обычного пиклиста, при этом из текстового поля (в котором хранятся выбранные ранее значения) «вычленяются» уже выбранные значения и проставляются в мульти-пиклисте;
    • IsChecked – вспомогательная функция, которая проверяет выбрано ли какое-либо значение в мульти-пиклисте;
    • saveMultiSelect – сохраняет выбранные в мульти-пиклисте значения в текстовом поле.
  • Прикрепите созданный JS Веб-ресурс к форме и:
    • На онлоаде вызовите функцию createMultiSelect;
    • На онсейве вызовите функцию saveMultiSelect.

    В обе функции передайте имя пиклиста и имя поля для хранения выбранных значений.




Комментарии (2)
  • Татьяна 22.01.2012

    Здравствуйте! Большое спасибо за предложенный вариант кастомизации. Подскажите, пожалуйста, каким способом можно задать обязательность заполнения (обязательность выбора хотя бы одной позиции списка)для рассмотренного примера мультизначного пиклиста?

  • slivka_83 22.01.2012

    Здрасьте 🙂

    Можно например в функции saveMultiSelect, повесить проверку, содержит ли переменная result значения. И если нет отменять сохранение и выдвать юзверу сообщение.

*

code