Кастомизация
22
Мар
11

Сортировка представления по нескольким столбцам по умолчанию

В настройках всех представлений Вы можете выбрать поле по которому по умолчанию будет производиться сортировка. А еще… в CRM есть такая функциональность как сортировка по нескольким полям. Чтобы отсортировать представление по нескольким полям, достаточно щелкнуть по заголовкам столбцов удерживая клавишу Shift. Но при этом CRM не предоставляет возможности настройки сортировки по нескольким полям по умолчанию (т.е. при открытии). Сейчас исправим этот недостаток:

  • Откройте в каком-нибудь текстовом редакторе файл <сайт CRM>\_root\HomePage.aspx;
  • Добавьте к функции window.onload() такой код:
    // Проверяем, что представление сформировано для объкта Бизнес-партнер
    if (document.all.divGridParams.children["otc"].value == 1) {
    
    	// Производим сортировку по несколорльким столбцам
    	// в формате "имя_поля1:<порядок_сортировки>;имя_поля2:<порядок_сортировки>"
    	// <порядок_сортировки> может принимать значения 1 или 0, где 1 - по возрастанию, а  0 - по убыванию
    	document.all.divGridProps.children["sortColumns"].value = "telephone1:0;address1_city:1";
    	crmGrid.Refresh();
                
    	// Удаляем существующую стрелку-маркер сортировки с заголвка столбца (по которому производится сортировка по умолчанию)
    	var allHTMLTags = new Array();
    
    	function hideArrow(theClass) {
    	var allHTMLTags = document.getElementsByTagName("img");
    		for (i = 0; i < allHTMLTags.length; i++) {
    			if (allHTMLTags[i].className == theClass && allHTMLTags[i].style.visibility == "visible") {
    				allHTMLTags[i].style.visibility = "hidden";
    			}
    		}
    	}
    	hideArrow("ms-crm-List-Sortable");
                
    	// Добавляем стрелки-маркеры сортировки для нескольких полей сортировки
    	function showArrow(fieldName, orderSort) {
    		var th = document.getElementsByTagName('th')
    		for (var i = 0; i < th.length; i++) {
    			if (th[i].fieldname == fieldName) {
    				var img = th[i].getElementsByTagName('img');
    				var arrow = th[i].childNodes[0].childNodes[1];
    				arrow.style.visibility = "visible";
    				if (orderSort == 1) arrow.style.filter = 'flipV';
    			}
    		}
    	}
    
    	// В качестве параметров передаем имя поля и порядок сортировки
    	// сортировка: 1 - по возрастанию, 0 - по убыванию
    	showArrow("telephone1", '0');
    	showArrow("address1_city", '1');
    }
    

    В этом коде Вам необходимо подправить две вещи:

    • «telephone1:0;address1_city:1» заменить на нужные поля и порядок сортировки;
    • Вызвать функцию showArrow и передать ей имена полей и порядок сортировки для отображения стрелок в заголовке столбцов.
  • Смотрим 🙂


Комментарии (11)
  • Катя 22.03.2010

    Очень полезный пост спасибо!. Долго искала.

  • Азат 22.03.2010

    А если для разных представлений требуются различные сортировки — как быть?

  • Азат 22.03.2010

    (имею ввиду для разных представлений одного объекта)

  • slivka_83 22.03.2010

    Добрый день.

    Извините что долго не отвечал — был очень занят 🙂

    Вам нужно считать значение Select’а с id SavedQuerySelector и в зависимости от его значения производить сортировку.

  • Michael 22.03.2010

    Super!!! Spasibo =)

  • Азат 22.03.2010

    Как сделать, чтобы этот код работал не только при загрузке дефолтного представления, но и при смене представлений? (например, если после открытия дефолтного представления сущности переключиться на другое представление, а затем обратно на дефолтное — вышеуказанный код не работает и выводится сортировка по одному столбцу :(( )

    И хотелось бы узнать подробнее, как «считать значение Select’а с id SavedQuerySelector и в зависимости от его значения производить сортировку» (к вопросу о различных сортировках для разных представлений одной сущности)

  • slivka_83 22.03.2010

    Добрый день.

    Извините что так долго… был немного занят…

    При смене представления не происходит перезагрузки страница в фрейме, поэтому скрипт и не срабатывает. Единственное что приходит на ум — привязаться событие к смене значаения и при его наступлении выполнять код:

    window.attachEvent("onload", OnGridPageLoad)
    function OnGridPageLoad() {
        var oSavedQuerySelector = document.all.SavedQuerySelector;
        oSavedQuerySelector.attachEvent("onchange", OnCrmGridReady);
    }
    
    function OnCrmGridReady() {
        alert(document.all.SavedQuerySelector[document.all.SavedQuerySelector.selectedIndex].text);
    }
    

    Но тут нада еще учесть что событие смены происходит до обновления самого представления, поэтому возможно потребуется задействовать таймаут 🙂

  • Uberz 22.03.2010

    Здравствуйте. А есть ли способ для сущности Действие(ActivityPointer)? window.onload() не срабатывает.
    И еще, не знаю где спросить: «Можно ли как либо сортировать по атрибутам объекта не являющегося основным в представлении»? (Например: мне нужно в представлении бизнес-партнеров отсортировать клиентов по должности основного контакта)

  • slivka_83 22.03.2010

    Здравствуйте.
    Про window.onload не понял.
    А вот сортировку такую сделать нельзя. На поля дочерних объектов нельзя ни сортировку ни фильтры вешать.

  • Uberz 22.03.2010

    Откройте в каком-нибудь текстовом редакторе файл \_root\HomePage.aspx;
    Добавьте к функции window.onload() такой код:
    (Ваш код)
    Так вот если в рабочей области выбираешь бизнесс- партнеров, чтобы справа отобразилось представление по умолчанию для сущности Account, то код отрабатывает нормально, а вот если выбираешь Действия, то он вообще не запускается.

  • slivka_83 22.03.2010

    Если не ошибаюсь, то у Действий своя ASPX-страница. Найдите ее и в нее подставьте код.

*

code