Показать сообщение отдельно
Старый 11.09.2009, 14:25   #19  
datfi is offline
datfi
Участник
 
240 / 15 (1) ++
Регистрация: 20.08.2009
Адрес: Россия, Сыктывкар
Цитата:
Сообщение от a33ik Посмотреть сообщение
Делал подобную кастомизацию с тем отличием, что это всё выполнялось не из заказа, а из предложения.

Итак идея:
1. Отключаем фильтрацию параметров в CRM - добавляете параметр в ветку реестра HKEY_Local_Machine\Software\Microsoft\MSCRM
DWORD DisableParameterFilter = 1 и выполняете iisreset.
2. Добавляете через ISV конфиг кнопку в сущность, из которой надо вызывать открытие письма с заполнением тела деталями. Суть - открыть новое письмо с дополнительным параметром в строке по наличию которого анализируется, что надо заполнить тело письма. Код кнопки:

Код:
        <Entity name="quote">
          <ToolBar ValidForCreate="0" ValidForUpdate="1">
            <Button Icon="/_imgs/ico_16.gif" JavaScript="var url = '/' + ORG_UNIQUE_NAME + '/activities/email/edit.aspx?pId=' + crmForm.ObjectId + '&amp;pType='+crmForm.ObjectTypeCode+ '&amp;pName=' + crmForm.all.name.DataValue + '&amp;FillWithQuoteDetails=1'; window.open(url);">
              <Titles>
                <Title LCID="1049" Text="Заявка на информацию" />
              </Titles>
              <ToolTips>
                <ToolTip LCID="1049" Text="Заявка на информацию" />
              </ToolTips>
            </Button>
          </ToolBar>
	</Entity>
3. Написание OnLoad карточки email, который проверит наличие доп параметра и если он присутствует при помощи Fetch вытащит все нужные данные и сформирует тело письма.

Код:
function InsertDescription()
{
	var descrFrame = document.getElementById('descriptionIFrame');

	if(descrFrame.readyState != 'complete')
		return;

	var quoteid = '';
	if (crmForm.all.regardingobjectid.DataValue != null && crmForm.all.regardingobjectid.DataValue[0] != null)
		quoteid = crmForm.all.regardingobjectid.DataValue[0].id;
	else
		return;


	var textbody = "Прошу предоставить информацию по указанным продуктам:";

	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'>"+ 
	GenerateAuthenticationHeader()+
	"<soap:Body>"+ 
	"<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+ 
	"<fetchXml>&lt;fetch mapping='logical'&gt;"+
	"&lt;entity name='quotedetail'&gt;"+
	"&lt;attribute name='productdescription'/&gt;"+
	"&lt;attribute name='quantity'/&gt;"+
	"&lt;attribute name='productid'/&gt;"+
	"&lt;attribute name='uomid'/&gt;"+
	"&lt;filter type='and'&gt;"+
	"&lt;condition attribute='quoteid' operator='eq' value='" + quoteid + "'/&gt;"+
	"&lt;/filter&gt;"+
	"&lt;/entity&gt;"+
	"&lt;/fetch&gt;</fetchXml>"+ 
	"</Fetch>"+ 
	"</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/Fetch");
	xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
	xHReq.setRequestHeader("Content-Length", xml.length);
	xHReq.send(xml);
	var resultXml = xHReq.responseXML;


	var resultSet = resultXml.text;
	resultSet.replace('&lt;','<');
	resultSet.replace('&gt;','>');

	var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	oXmlDoc.async = false;
	oXmlDoc.loadXML(resultSet);
	var results = oXmlDoc.getElementsByTagName('result');

	//debugger;

	for (var i=0; i < results.length;i++)
	{
		textbody = textbody + "<br/>"+ 
		(results[i].selectSingleNode('./productid') == null ? "" : results[i].selectSingleNode('./productid').getAttribute('name')) + 
		" " + (results[i].selectSingleNode('./productdescription') == null ? "" : results[i].selectSingleNode('./productdescription').nodeTypedValue) 

+
		" в количестве " + (results[i].selectSingleNode('./quantity') == null ? "" : results[i].selectSingleNode('./quantity').nodeTypedValue) +
		" " + (results[i].selectSingleNode('./uomid') == null ? "" : results[i].selectSingleNode('./uomid').getAttribute('name'));
	}

	var descrWindow = document.frames['descriptionIFrame'];
	descrWindow.document.body.innerHTML = textbody;
}


if (crmForm.FormType == 1 && window.location.href.indexOf('FillWithQuoteDetails=1') != -1)
{
	var descrFrame = document.getElementById('descriptionIFrame');
	descrFrame.attachEvent('onreadystatechange',InsertDescription);
}
Надеюсь, что Вам пригодится. Чтобы под заказ переделать - не думаю, что будет много работы.
Самое оно то. Только вопрос HKEY_Local_Machine\Software\Microsoft\MSCRM
DWORD DisableParameterFilter = 1 на что еще повлияет? Какую фильтрацию оно отключает?