Кастомизация
16
Сен
15

Приемы работы с левой навигационной панелью

Скрытие пунктов навигационной панели

Ну, это самая распространенная кастомизаия. Обычно ее используют вместе определением роли пользователя. Предварительно с помощью IE Developer Toolbar нужно узнать айдишник ссылки, а затем подставить ее в этот код (который нужно поместить на онлоад):

var navLeftItem = document.getElementById('navActivityHistory');
navLeftItem .style.display = 'none';


Скрытие группы пунктов на навигационной панели

function setNavBarSectionVisibilityByName ( sectionName, visible )  { 
	var groups = document.getElementById("crmNavBar").childNodes; 

	if( groups != null )  { 
		for( var i = 0; i < groups.length; i++ )  { 
			var groupName = groups[i].childNodes[0]; 

			if( groupName.innerText.trim() == sectionName )  { 
				groupName.style.display = visible ? "block" : "none"; 
				groups[i].childNodes[1].style.display = visible ? "block" : "none"; 
			} 
		} 
	} 
}

setNavBarSectionVisibilityByName ("Действия", false);

Скрытие всей навигационной панели

Если в Ваше развертывании имеются очень простые объекты, для которых не требуется левая навигационная панель, то используя JavaScript ее можно сурыть. Естественно это не поддерживаемый метод 🙂

Следующий JavaScript-код скрывает левую навигационную панель, и изменить основную область формы так, чтобы автоматически расширить ее на весь экран. Повесьте его на онлоад.

function getElementsByClassName(classname, node) {

	if(!node) node = document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
	for(var i=0,j=els.length; i<j; i++)
		if(re.test(els[i].className))a.push(els[i]);
	return a;
}

var elements = getElementsByClassName('ms-crm-Form-LeftBar');

for (var p=0; p<elements.length; p++) {
	elements[p].style.display = 'none';
	elements[p].style.width = '1%';
}

var tables = getElementsByClassName('ms-crm-Form-Layout');

for (var k=0; k<tables.length; k++) {
	tables[k].style.tableLayout = 'auto';
}


Подмена ссылок

Дпустим Вы создали новую кастомную сущность, которая заменяет какую-либо стандартную в Вашем развертывании. К примеру, Вам не хватало функциональности объекта Адрес и Вы заменили его новым объектом new_address и связали его с объектом Контакт. Но Вас не устраивает, что ссылка на связанную сущность появляется под ссылкой Бизнес-процессы (все новые ссылки добавляются в конц списка). И вообще у стандартных Дополнительныйх адресов красивая иконка 🙂

Вобщем, заменим ссылку на объект Дополнительных адресов ссылкой на новую кастомную сущность Новый адрес.

// подменяем ссылку системной сущности Адрес на кастомную
// айдишник заменяемой связи и содержимое функции loadArea можно узнать с помощью IE Developer Toolbar

if (document.getElementById('navAddresses') != null) {

	document.getElementById('navAddresses').onclick = function() {
		loadArea('areanew_new_address_contact', '\x26roleOrd\x3d2'); 
	}
    
}

// скрываем кастомную связь, айдишник также узнаем с помощью IE Dev Toolbar

if (document.getElementById('navnew_new_address_contact') != null) {

	document.getElementById('navnew_new_address_contact').style.display = 'none';
    
}



Переименование пунктов меню

Вы не можете сделать это через ISV.config, поскольку через него в левое навигационного меню можно добавить только новые ссылки, но нельзя редактировать уже существующие (они там даже отображаются).

Чтобы переименовывать любую из стандартных или кастомных ссылок воспользуйтесь нижеследующим javascript-кодом (как всегда на событие OnLoad). Id’ишник пункта меню узнаем с помощью IE Developer Toolbar, а во второй строчке указываем заменяемое и замещаемое название этой ссылки.

var navItem = document.getElementById('navRelationships');
navItem.innerHTML = navItem.innerHTML.replace('>Отношения','>Ежики в тумане');


Отображение количства связанныз записей

Если хотите видеть количество связанных объектов не открывая при этом связанное представление, то можете воспользоваться нижеследующим кодом (вешать на онлоад). В данном случаи производится подсчет количества действий и историй. Но его довольно просто переделать для подсчета и других записей.

var buXml = GetRegardingActivity();

if(buXml != null) {

    var buNodes = buXml.selectNodes("//BusinessEntity/q1:statecode");
    var iActivity = 0;
    var iHistory = 0;

	if(buNodes != null ) {

		// перебираем строки которые вернул SOAP-запрос
		for( i = 0; i < buNodes.length; i++) {
        
			// подсчитываем количество действий и историю
            switch(buNodes[i].text) {
				case "Open" : iActivity++; break;
				case "Scheduled" : iActivity++; break;
				case "Completed" : iHistory++; break;
				case "Canceled" : iHistory++; break;
			}
		}
		
        // добавляем к ссылке Действий количество
        if(document.getElementById('navActivities') != null) {
        
			document.getElementById('navActivities').getElementsByTagName('NOBR')[0].innerText = document.getElementById('navActivities').getElementsByTagName('NOBR')[0].innerText + " (" + iActivity + ")";
		
        }

        // добавляем к ссылке Истории количество
        if(document.getElementById('navActivityHistory') != null) {

			document.getElementById('navActivityHistory').getElementsByTagName('NOBR')[0].innerText = document.getElementById('navActivityHistory').getElementsByTagName('NOBR')[0].innerText + " (" + iHistory + ")";
		
        }
	}
}

function GetRegardingActivity() {

	var xml = "" +
	"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
	"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
	" <soap:Body>" +
	" <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\" xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">" +
	" <q1:EntityName>activitypointer</q1:EntityName>" +
	" <q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
	" <q1:Attributes>" +
	" <q1:Attribute>statecode</q1:Attribute>" +
	" </q1:Attributes>" +
	" </q1:ColumnSet>" +
	" <q1:Distinct>false</q1:Distinct>" +
	" <q1:Criteria>" +
	" <q1:FilterOperator>And</q1:FilterOperator>" +
	" <q1:Conditions>" +
	" <q1:Condition>" +
	" <q1:AttributeName>regardingobjectid</q1:AttributeName>" +
	" <q1:Operator>Equal</q1:Operator>" +
	" <q1:Values>" +
	" <q1:Value xsi:type=\"xsd:string\">" + crmForm.ObjectId + "</q1:Value>" +
	" </q1:Values>" +
	" </q1:Condition>" +
	" </q1:Conditions>" +
	" </q1:Criteria>" +
	" </query>" +
	" </soap:Body>" +
	"</soap:Envelope>" +
	"";

	var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
	xmlHttpRequest.Open("POST", "/mscrmservices/2006/CrmService.asmx", false);
	xmlHttpRequest.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2006/WebServices/RetrieveMultiple");
	xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
	xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
	xmlHttpRequest.send(xml);

	var resultXml = xmlHttpRequest.responseXML;
	return resultXml;
    
}


Раздел по умолчанию

Чтобы при загрузке формы сразу перейти на нужную ссылку на левой навигационной панели, повесьте на онлоад такой код:

var NavItem=document.getElementById('LeftNavigationID');
if(NavItem!=null)
NavItem.click();

Таблица айдишников стандартных ссылок

Табличка с айдишниками ссылок (на инглише).

Ссылка ID ссылки Заголовок по умолчанию
Activities navActivities View Activities
Campaign Activities navCampaignActivities View Campaign Activities
Campaign Responses navCampaignResponses View Campaign Responses
Campaigns navCampaignsInSFA View Campaigns
Campaigns navCampaignsInList View Campaigns
Cases navService View Cases
Cases navCases View Cases
Competitors navComp View Competitors
Competitors navComps View Competitors
Contacts navContacts View Contacts
Contacts Excluded navBulkOperationFailures View Contacts Excluded
Contacts Selected navTargetedMembers View Contacts Selected
Contract Lines navContractLines View Contract Lines
Contracts navContracts View Contracts
Documents navDoc View Documents
E-mail Messages Created navBulkOperationSuccesses View E-mail Messages Created
Existing Products navExistingProducts View Existing Products
History navActivityHistory View History
Information navInfo View general information about this record
Invoices navInvoices View Invoices
Marketing List Members navListMember View Marketing List Members
Marketing Lists navListsInSFA View Marketing Lists
More Addresses navAddresses More Addresses
Opportunities navOpps View Opportunities
Orders navOrders View Orders
Other Contacts navContacts View Other Contacts
Planning Tasks navTasks View Planning Tasks
Price List Items navPrices View Price List Items
Products navProducts View Products
Quick Campaigns navMiniCampaignsForList View QuickCampaigns
Quotes navQuotes View Quotes
Related Campaigns navCampaigns View Related Campaigns
Relationships navRelationship View Relationships
Sales Literature navCollaterals View Sales Literature
Sales Literature navSalesLit View Sales Literature
Sub-Accounts navSubAct View Sub-Accounts
Sub-Contacts navSubContacts View Sub-Contacts
Substitutes navSubs View Substitutes
Target Marketing Lists navTargetLists View Target Marketing Lists
Target Products navTargetProducts View Target Products
Workflows navAsyncOperations View Workflows
Write-In Products navWriteInProducts View Write-In Products
Комментарии (15)
  • Влад 16.09.2009

    В тему «Подмена ссылок»: при создании связи можно настроить, будет ли появляться пункт на родительской записи в leftnavbar. Для этого в настройках связи (напрмер 1:N): секция «Элемент области переходов для основного объекта», поле «Параметры отображения» выставить в «Не отображать».

  • slivka_83 16.09.2009

    Угу 🙂 У меня на скриншоте создания связи N:N показано, что для одного объекта связь отображается, а для другого нет 🙂

  • Tsoifun 16.09.2009

    Подскажите, пожалуйста, каким образом в левую панель добавить ссылку на sharepoint? Чтобы кнопочку тыкнул и на свой sharepoint попал.

    Огромное спасибо за сайт -ООООЧЕНЬ много всякой полезной инфо

  • slivka_83 16.09.2009

    Это просто 🙂
    Посмотрите секцию Left Nav Bar http://msdn.microsoft.com/en-us/library/cc468415.aspx
    она как раз и добавляет ссылку на левую панель 🙂

  • Tsoifun 16.09.2009

    СПАСИБО!!!!

  • Stanislav 16.09.2009

    Можноли напрямую обратиться к navActivityHistory,
    т.е. журналу завершенных действий

  • slivka_83 16.09.2009

    Не уверен… ведь он отображает только связанные с текущей записью действия.
    Хотя что Вы подразумеваете под «обратится»?

  • Азат 16.09.2009

    В «Отображение количества связанных записей»:

                switch(buNodes[i].text) {
    				case "Open" : iActivity++; break;
    				case "Scheduled" : iActivity++; break;
    				case "Completed" : iHistory++; break;
    				case "Canceled" : iHistory++; break;
    			}
    

    Здесь, как я понимаю, «Open», «Scheduled», «Completed» и «Canceled» — значения, которые может принимать statecode для соотвествующих объектов?

    Как тогда быть с кастомными объектами?
    «Активный» и «Неативные» не работают, пробовал «Active» — тоже не помогает….

  • slivka_83 16.09.2009

    А Вы сам SOAP запрос правили? 🙂 он вытаскивает только Действия, которые связаны по полю regardingobjectid с текущей записью 🙂

  • Азат 16.09.2009

    Спасибо! Заработало!!!

    Помимо замены regardingobjectid на идентификатор кастомной сущности, вместо activitypointer надо указать имя кастомной сущности.

  • Павел 16.09.2009

    Вставил этот код на форму Контакт в onload ничего не правил в коде… но почему то в Действиях и Журнале справа от названия слева отображаются одни нули, хотя реально есть действия открытие и закрытые.

    В чем баг?
    у меня MS Dynamics CRM 4.0

  • slivka_83 16.09.2009

    >хотя реально есть действия
    У этих действий в поле в Отношении установлен Бизнес-партнер, на котором проводите эксперимент?

  • Александр 16.09.2009

    Для загрузки кастомной aspx странички вместо пункта меню, можно воспользоваться кодом ниже:

    if (document.getElementById('navQuotas') != null) {
       document.getElementById('navQuotas').onclick = function() {
          openIsvWin('http\x3a\x2f\x2fCRM\x2fISV\x2fPLANS\x2fplans.aspx', false, -1, '')
       }
    }
    

    в данном случае вместо Планы продаж в сущности Пользователь, подгружается страничка по адресу
    http://crm/isv/plans/plans.aspx
    код вешается на онлоад сущности systemuser

  • Александр 16.09.2009

    можно и так написать

    openIsvWin('http://crm/isv/plans/plans.aspx?ParameterName='+crmForm.ObjectId, false, -1, '')
    
  • slivka_83 16.09.2009

    Пасиб 🙂 будем знать 🙂

*

code