Кастомизация
12
Авг
3

Убираем кнопки с панели инструментов связанных объектов

Передвигаясь по связанным объектам (на форме основного объекта) Вы могли заметить такие интересные кнопочки, вроде «Создать объект бла-бла-бла» или «Добавить существующие объект бла-бла-бла». Иногда они не нужны или что еще хуже, то их удаление это требование политики безопасности компании. И как всегда, стандартными средствами настройки их не удалить!

Но это еще полбеды. Проблема в том, что в момент загрузки формы этих связанных объектов нет на форме! Они подгружаются в iFrame динамически при щелчке на соответствующей ссылке (расположено на левой навигационной панели формы). Таким образом воспользоваться простым способом скрытия объектов (как мы обычно скрываем поля на форме) нам не удастся, т.к. мы тупо не можем к ним обратиться!

Какой выход? Выход простой (точнее сложный, но это уже совсем другая история 🙂 ) – переопределить событие щелчка по ссылке на навигационной панели и таким образом отследить момент срабатывания js-функции CRM, отвечающую за подгрузку представления связанного объекта. После чего обратиться к уже появившемся кнопкам и скрыть их!

В первую очередь на онлоад формы добавьте следующий скрипт:

function HideViewButtons(Iframe, buttonTitles) { 
	if (Iframe != null ) {
		Iframe.onreadystatechange = function HideTitledButtons() { 
			if (Iframe.readyState == 'complete') { 
				var iFrame = frames[window.event.srcElement.id]; 
				var liElements = iFrame.document.getElementsByTagName('li'); 
 
				for (var j = 0; j < buttonTitles.length; j++) { 
					for (var i = 0; i < liElements.length; i++) { 
						if (liElements[i].getAttribute('title') == buttonTitles[j]) { 
							liElements[i].style.display = 'none';
                            liElements[i].style.visibility = 'hidden'; 
							break; 
						}
					} 
				} 
			} 
		} 
	}
} 

function HideAssociatedViewButtons(type, loadAreaId, buttonTitles) {

    if (type== 1 || type== 3) {
    	var navElement = document.getElementById('nav' + loadAreaId);
    } else {
    	var navElement = document.getElementById('nav_' + loadAreaId);
    }

	if (navElement != null) {
		navElement.onclick = function LoadAreaOverride() {
			if (type == 1) {
				loadArea('area' + loadAreaId);
                HideViewButtons(document.getElementById('area' + loadAreaId + 'Frame'), buttonTitles);
			} else if (type == 2) {
				loadArea(loadAreaId);
                HideViewButtons(document.getElementById(loadAreaId + 'Frame'), buttonTitles);
			} else {
				loadArea('area' + loadAreaId, '\x26roleOrd\x3d1');
                HideViewButtons(document.getElementById('area' + loadAreaId + 'Frame'), buttonTitles);
			}
		}
	}
}

Дальше необходимо вызвать функцию HideAssociatedViewButtons (тоже из онлоада) и передать ей три параметра (в порядке следования):

  • Тип связи, который должен быть равен:
    1 – для любой стандартной связи (т.е. уже существующей в системе)
    2 – для кастомной 1:N связь
    3 – для кастомной N:N связь
  • Имя подгружаемой области – вытащить ее можно так: откройте какую-либо запись нужного Вам объекта, запускаете IEDevTool нажатием F12 (в IE8 этот инструмент уже встроен), активируете инструмент «Выбрать элемент щелчком» (или нажмите Ctrl + B), выделяете кнопку на левой навигационной панели которая связана с нужным Вам объектом, скопируйте текст атрибута if (тега <a>), но исключите из него префиксы nav или nav_ (ели они есть);
  • Названия кнопок, которые хотите скрыть (через запятую). Названия можете посмотреть выделив кнопку с помощью того же «Выбрать элемент щелчком» и скопировав атрибут Title (тега <a>).

Пробуем

Я добавил на форму Бизнес-партнеров две дополнительные связи: кастомная связь N:1 с объектом Контракт и кастомная связь N:N с объектом Конкурент! Теперь скроем эти две записи, плюс две стандартные с объектами Контакт (N:1) и Маркетинговый список (N:N).

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





Затем скроем их, вызвав функцию HideAssociatedViewButtons с нужными параметрами:

ideAssociatedViewButtons(1,'Contacts', ['Добавить к этой записи новый объект Контакт', 'Добавить к этой записи существующий объект Контакт']);

HideAssociatedViewButtons(1,'ListsInSFA', ['Добавить в маркетинговый список']);

HideAssociatedViewButtons(2,'new_account_contract', ['Добавить к этой записи новый объект Контракт', 'Добавить к этой записи существующий объект Контракт']);

HideAssociatedViewButtons(3,'new_account_incident', ['Добавить к этой записи существующий объект Обращение']);


Результат



Комментарии (3)
  • Anna 12.08.2009

    А из представлений в главном окне можно как-то кнопки скрыть?

  • Anna 12.08.2009

    После изменения размеров окна появляется пустое место (дырка) на месте спрятанной кнопки.

  • slivka_83 12.08.2009

    >А из представлений в главном окне можно как-то кнопки скрыть?
    http://mmcrm.ru/?p=796

    >После изменения размеров окна появляется пустое место (дырка) на месте спрятанной кнопки.

    Все верно 🙂 При изменении размеров происходит расчет свободного места для кнопок и в случае небходимости в них скрывается надпись 🙂 Поэтому при изменении размеров кнопки их свойство style.display получает значение block, в результате кнопка становится видна. Чтобы это обойти применены два свойства style.display и style.visibility
    Но побочным эффектом является пустое пространство 🙂

    Есть еще один способ — можно вообще удалить кнопку из DOM структуры. Но я не стал это реализовывать, т.к. и того что сделал помоеиу достаточно 🙂

*

code