Кастомизация
04
Июн
4

Вставка в Электронную почту форматированного текста с помощью JavaScript

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

Введение

В отличии от других объектов на форме электронной почты текст сообщения задается не в обычно поле (ntext, например), а в специальном iFramе’е. Этот iFramе служит WYSIWYG-редактором и позволяет с помощью панели инструментов расположенной над ним производить не хитрые манипуляции с текстом. Поэтому чтобы программно (с помощью JavaScript) задать для него форматированный текст, необходимо вместо DataValue использовать обращение к фрейму descriptionIFrame. А во вставках использовать теги HTML. Например:

document.all['descriptionIFrame'].contentWindow.document.body.innerHTML="Раз<br/>Два";

Если Вы собираетесь задавать текст сообщения на онлоаде, то поскольку это iFrame, необходимо сначала выполнить проверку, что iFrame загрузился:

// Дожидаемся загрузки фрейма
document.all['descriptionIFrame'].attachEvent("onreadystatechange", frameReady);

// Функция которая вызывается когда фрейм загружен
function frameReady() {
	if (document.all['descriptionIFrame'].readyState == 4 || document.all['descriptionIFrame'].readyState == "complete") 
		document.all['descriptionIFrame'].contentWindow.document.body.innerHTML = '<span style="color: #6600cc">это</span> просто <span style="font-weight: bold; font-style: italic">тест</span>'; 
}


Подпись

Рассмотрим более приземленную задачу: автоматическая вставка подписи в сообщения электронной почты.

Для решения этой задачи в CRM обычно используются шаблоны. Но они не всем нравятся т.к. это ручной способ. А юзвер обычно ленив и требует автоматики 🙂 Поэтому сделаем так, чтобы подпись вставлялась в письмо автоматически при его создании (чтобы юзвер в случаи чего мог его подредактировать). А данные для подписи будем брать из карточки пользователя создавшего электронное письмо. Просто повесьте на онлоад формы Электронной почты такой код:

// Выполняем код только если это форма создания записи 
if (crmForm.FormType != 1) return;

// Дожидаемся загрузки фрейма
document.all['descriptionIFrame'].attachEvent("onreadystatechange", frameReady);

// Функция которая вызывается когда фрейм загружен
function frameReady() {
	if (document.all['descriptionIFrame'].readyState == 4 || document.all['descriptionIFrame'].readyState == "complete") 
		document.all['descriptionIFrame'].contentWindow.document.body.innerHTML = generateHTML(); 
}

// Функция вытаскивает значения полей из карточки текущего пользователя и генерирует HTML-код
function generateHTML() {
	var authenticationHeader = GenerateAuthenticationHeader();

	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'>"+ 
	authenticationHeader+ 
	"<soap:Body>"+ 
	"<Retrieve xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+ 
	"<entityName>systemuser</entityName>"+ 
	"<id>"+getUserId()+"</id>"+ 
	"<columnSet xmlns:q1='http://schemas.microsoft.com/crm/2006/Query' xsi:type='q1:ColumnSet'>"+ 
	"<q1:Attributes>"+
	"<q1:Attribute>fullname</q1:Attribute>"+
	"<q1:Attribute>title</q1:Attribute>"+
	"<q1:Attribute>address1_telephone1</q1:Attribute>"+
	"<q1:Attribute>mobilephone</q1:Attribute>"+
	"<q1:Attribute>internalemailaddress</q1:Attribute>"+
	"</q1:Attributes>"+ 
	"</columnSet>"+ 
	"</Retrieve>"+ 
	"</soap:Body>"+ 
	"</soap:Envelope>";

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

	var resultXml = xHReq.responseXML;

	var errorCount = resultXml.selectNodes('//error').length;
	if (errorCount != 0) {
		var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
		alert(msg);
	} else {
		var fullname = (!resultXml.selectSingleNode("//q1:fullname")) ? '' : resultXml.selectSingleNode("//q1:fullname").nodeTypedValue;
		var title = (!resultXml.selectSingleNode("//q1:title")) ? '' : resultXml.selectSingleNode("//q1:title").nodeTypedValue;
		var telephone = (!resultXml.selectSingleNode("//q1:address1_telephone1")) ? '' : resultXml.selectSingleNode("//q1:address1_telephone1").nodeTypedValue;
		var mobilephone = (!resultXml.selectSingleNode("//q1:mobilephone")) ? '' : resultXml.selectSingleNode("//q1:mobilephone").nodeTypedValue;
		var email = (!resultXml.selectSingleNode("//q1:internalemailaddress")) ? '' : resultXml.selectSingleNode("//q1:internalemailaddress").nodeTypedValue;
		
		var html = '';
		html += '<br /><br />';
		html += '<span style="color: #6600cc">' + fullname + ', ' + title + '</span>';
		html += '<hr color="Brown">';
		html += '<table style="font: 12px Arial,sans-serif">';
		html += '<tr><td style="font-style: italic; margin-right: 10px">Рабочий телефон:</td><td>' + telephone + '</td></tr>';
		html += '<tr><td style="font-style: italic">Мобильный телефон:</td><td>' + mobilephone + '</td></tr>';
		html += '<tr><td style="font-style: italic">Электронная почта:</td><td>' + email + '</td></tr>';
		html += '</table>';
		
		return html;
	}
}

// Получаем айдишник пользователя
function getUserId() {
	try {
		var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		xmlhttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false);
		xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
		xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Execute");
		
		var soapBody = "<soap:Body>"+
		"<Execute xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+
		"<Request xsi:type='WhoAmIRequest' />"+
		"</Execute></soap:Body>";
		
		var soapXml = "<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'>";
		
		soapXml += GenerateAuthenticationHeader();
		soapXml += soapBody;
		soapXml += "</soap:Envelope>";
		
		xmlhttp.send(soapXml);
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=false;
		xmlDoc.loadXML(xmlhttp.responseXML.xml);
		
		var userid = xmlDoc.getElementsByTagName("UserId")[0].childNodes[0].nodeValue;
        
		return userid;
	}
	catch(e) {
		return null;
	}
}

Этот код разделен на три функции, которые вызываются одна за другой при загрузке iFrame’а descriptionIFrame (содержащего текст сообщения). Первая функция инициализируется когда статус iFrame’а становится «complete». Из нее вызывается функция генерирующая HTML-код для вставки в тело письма. А из нее, в свою очередь, вызывается функция getUserId, которая возвращает GUID текущего пользователя!


Комментарии (4)
  • Vladislav Osmanov 04.06.2010

    Опять изобретение велосипеда : ) Есть же _встроенный_ механизм шаболнов. Можно насоздавать шаблонов (в том числе и с HTML разметкой), а потом вставлять их кнопкой «Вставка шаблона»…

    Единственный минус — каждый шаблон норовит заменить тему, но этого можно избежать, нажав «отмена» в окне подтверждения вставки.

    Давно уже понял, чем больше используется стандартного функционала CRM, тем надёжнее и проще получается решение…

  • slivka_83 04.06.2010

    Кажеться Вы не поняли месседжа 🙂 я знаю про шаблоны 🙂 и у них есть недостаток по-хуже — они статичны (в плане формирования HTML-разметки) 🙂

  • Александр 04.06.2010

    Добрый день.
    Подскажите, как вставить полученную html-подпись в тело письма в CRM 2011. Предположим сформирована var htmlMy = ‘Это подпись‘; как вставить htmlMy в тело письма?
    Спасибо!

  • slivka_83 04.06.2010

    Здрасьте.
    Попробуйте примерно так:

    var html = "<html><b><i>Подпись с наклоном</i></b></html>"
    Xrm.Page.getAttribute("description").setValue(html.toString());
    

*

code