Разработка
26
Ноя
0

Приемы работы с вложенным Представлением CRM 2013

Ожидание загрузки Представления

Ожидаем загрузки Представления после открытия страницы для выполнения какой-либо логики. Параноидальный вариант 🙂

function subGridOnload() {
    var grid = $('#gridname');
    if (grid == null) {
        // Если Представление еще не появилось - ждем секунду и повторяем попытку
        setTimeout(subGridOnload, 1000);
        return;
    }

    if (grid[0] == undefined) {
        setTimeout(subGridOnload, 1000);
        return;
    }

    if (grid[0].control == undefined) {
        setTimeout(subGridOnload, 1000);
        return;
    }

    if (grid[0].control == null) {
        setTimeout(subGridOnload, 1000);
        return;
    }

    if (grid[0].control.get_totalRecordCount() == -1) {
        setTimeout(subGridOnload, 1000);
        return;
    }

    // Полезная логика
}

Чтение выбранных записей

Перебираем, и выводим в алерте, выбранные во вложенном Представлении записи:

function ReadSelectedSubGridRecords() {
    if (document.getElementById("SubGridName")) {
        var grid = document.getElementById("SubGridName").control;
        for (var row = 0; row < grid.get_selectedRecords().length; row++)
            alert(grid.get_selectedRecords()[row].Name);
    }
}

Чтение всех строк и всех столбцов

Перебираем все строки и все их столбцы вложенного Представления.

function RetrieveSubGridRecords() {
    if (document.getElementById("contactcasessgrid")) {
        var grid = document.getElementById("contactcasessgrid").control;
        for (var rowNo = 0; rowNo < grid.GetRecordsFromInnerGrid().length; rowNo++)
            for (var cellNo = 0; cellNo < grid.GetRecordsFromInnerGrid()[rowNo][3].cells.length; cellNo++)
                alert(grid.GetRecordsFromInnerGrid()[rowNo][3].cells[cellNo].outerText);
    } else {
        // Ждем пока загрузится вложенное Представление
        setTimeout("RetrieveSubGridRecords();", 2500);
    }
}

GUID’ы всех записей

Просто перебираем GUID’ы всех записей вложенного Представления.

function GetAllIds() {
    var gridControl = document.getElementById("subGridName").control;
    var subGridIds = gridControl.get_allRecordIds();
    for (i = 0; i < subGridIds.length; i++) {
        alert(subGridIds[i].replace("{", "").replace("}", ""));
    }
}

Идентификатор выбранной записи при ее выделении

При выборе записи во вложенном Представлении получаем ее идентификатор:

function SubGridHandler() {
    SubGridName = "Contacts";

    if (document.getElementById(SubGridName)) {
        var mySubGrid = document.getElementById(SubGridName);
        var selectedId = undefined;

        // Добавляем обработчик к событию выделения
        mySubGrid.control.add_onSelectionChange(function (sender) {
            if (sender.get_selectedIds()[0] == undefined || sender.get_selectedIds()[0] == selectedId)
                return;

            // Обрабатываем выделенную запись
            var selectedRecord = sender.get_selectedRecords()[0];
            alert(selectedRecord.TypeName + ": " + selectedRecord.Name + " " + selectedRecord.Id);

            selectedId = sender.get_selectedIds()[0]; // Предотвращаем двойное срабатывание
        });
    } else {
        setTimeout(SubGridHandler, 1000); // Ожидаем загрузки
    }
}

Чтение всех строк определенного столбца

Перебираем все строки и выводим значение одного конкретного столбца вложенного Представления.

function GetSubGridCellValues() {
    if (document.getElementById("SubGridName")) {
        var grid = document.getElementById("SubGridName").control;
        var ids = gridControl.get_allRecordIds();
        for (i = 0; i < ids.length; i++) {
            alert(gridControl.getCellValue('fullname', ids[i]));
        }
    }
    else {
        setTimeout("GetSubGridCellValues();", 2500);
    }
}

Отслеживание события OnClick

Отслеживаем событие клика по вложенному Представлению, чтобы, например, подсчитать количество выбранных записей:

function ReadSelectedSubGridRecords() {
    if (document.getElementById("SubGridName")) {
        var grid = document.getElementById("SubGridName").control;
        for (var rowNo = 0; rowNo < grid.get_selectedRecords().length; rowNo++)
            alert(grid.get_selectedRecords()[rowNo].Name);
    }
}

function Form_OnLoad() {
    if (document.getElementById("SubGridName")) {
        var grid = document.getElementById("SubGridName");
        // Google Chrome
        if (grid.addEventListener) {
            grid.addEventListener('click', ReadSelectedSubGridRecords, false);
            // IE
        } else if (grid.attachEvent) {
            grid.attachEvent('onclick', ReadSelectedSubGridRecords);
        }
    }
    else {
        setTimeout("Form_OnLoad();", 2000);
    }
}

Фильтрация данных

Динамически изменяем условие отбора записей для вложенного Представления:

function FilterSubGrid() {
    if (document.getElementById("Contacts")) {
        var subGrid = document.getElementById("Contacts");
        var fetchXML = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
          "<entity name='contact'>" +
            "<attribute name='fullname' />" +
            "<attribute name='emailaddress1' />" +
            "<attribute name='statecode' />" +
            "<attribute name='ownerid' />" +
            "<attribute name='contactid' />" +
            "<order attribute='fullname' descending='false' />" +
            "<filter type='and'>" +
              "<condition attribute='firstname' operator='eq' value='Ирина' />" +
            "</filter>" +
          "</entity>" +
        "</fetch>";

        subGrid.control.SetParameter("fetchXml", fetchXML);
        subGrid.control.refresh();
    } else {
        // Ждем пока загрузится вложенное Представление
        setTimeout(FilterSubGrid, 2500);
    }
}

Замена значения в ячейки

Для примера заменим в ячейки с полем Состояния значение на одну из стандартных иконок CRM.

function bindToEntityGrid(myObject) {
    // Подключаемся с событию изменения DOM 
    $(document).bind('DOMNodeInserted', myObject, function (e) {
        // Находим таблицу (т.е. Представление) с именем объекта, который отображается в Представлении
        if ($('table[ologicalname="' + e.data.entityName + '"]').length > 0) {
            // Если таблица найдена (т.е. Представление построено) вызываем переданную в параметрах функцию
            e.data.matchFunction(e);
        }
    });
}

function stateCodeRepalce(e) {
    // Определяем номер столбца, в котором содержится поле Состояние
    var colIndex = $('table[ologicalname="' + e.data.entityName + '"]').find('col.ms-crm-List-DataColumn[name="' + e.data.fieldName + '"]').index() - 1;
    // Находим все строки Представления и для каждой ячейки с полем Состояние... 
    $('.ms-crm-List-Row-Lite[otypename="' + e.data.entityName + '"]').find(".ms-crm-List-DataCell-Lite:nth(" + colIndex + ")").each(function (index) {
        // Заменяем значение на иконку
        if ($(this).text() === "Активный") {
            $(this).html("<div class='ms-crm-ImageStrip-notif_icn_warn16'></div>");
        }
        else if ($(this).text() === "Неактивный") {
            $(this).html("<div class='ms-crm-ImageStrip-inlineedit_warning'></div>");
        }
    });
}

Все что требуется — вызвать функцию bindToEntityGrid и передать ей в объекте имя сущности, имя поля и название функции вызываемую при изменение DOM. Например, так:

{entityName: 'contact', fieldName: 'statecode', matchFunction: stateCodeRepalce}


Комментарии (0)

*

code