2008-09-09

Сущность template, plug-in и Javascript

Начну с того, что сущность template не изменяемая, но настраиваемая. Однако, это не преимущество. Я не понимаю по каким причинам сущность template была скрыта от нас, но ни форма ни события на ней нам недоступны.
Более того, plug-in на шаг PreCreate для этой сущности дает поразительный результат - при выбрасывании InvalidPluginExecutionException стирает тело и тему самого template.
А задача простая - не дать или хотя бы уведомить пользователя о том, что шаблон с таким именем уже существует. Ну чтобы пользователь потом не выбирал из десятка шаблонов с одинаковым title.
Как же решить? Plug-in не функционален, скрипт вставить некуда. Решил внедриться в оригинальную страничку. Называется она emailtemplateeditor.aspx. Там есть функция Save в нее и написал свой код.
Но проблема обнаружилась и тут. Оказывается CRM не дает обратиться к значению поля templateid (нужно, чтобы title не сравнивать с самим собой), т.е. crmForm.all.templateid.DataValue не работает.
Что ж решил действовать старым проверенным способом через crmForm.FormType, чтобы узнать создаем новый шаблон(FormType=1) или редактируем старый(FormType=2). И тут Microsoft окончательно убедил меня в том, что его сотрудники видимо произошли не от углеродной формы жизни - FormType=0 (Undefined form type). Т.е. согласно SDK сущность создана для системных нужд "For internal use only".

Спасло свойство crmForm.ObjectId, которое и содержало значение поля templateid.
В результате скрипт был закончен и стал иметь такой вид:


var url = "http://mcrm4/wsTemplateCreateCheckDup/CheckTemplateTitleDup.asmx/IsDup";
var templateid="null";
if (crmForm.ObjectId != null)
{
templateid=crmForm.ObjectId;
templateid=templateid.slice(1, templateid.indexOf('}'));
}
var paramstr = "TemplateTitle="+crmForm.all.title.DataValue+"&"+"TemplateId="+templateid;
try{
var oXmlHTTP = new ActiveXObject("Msxml2.XMLHTTP");
oXmlHTTP.open("POST", url,false);
oXmlHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
oXmlHTTP.send(paramstr);
if(oXmlHTTP.status == 200)
{
var retstr=oXmlHTTP.responseText;
var retidx=retstr.indexOf(">found");
if(retidx>0)
{
alert("Имя шаблона '"+crmForm.all.title.value+"' уже есть в списке.\n Пожалуйста, задайте другое имя.");
SubjectEditor.focus();
event.returnValue=false;
return false;
}
}
else
{
alert("Ошибка "+ oXmlHTTP.status+" при проверке на повторное использование имени шаблона.");
}
}
catch(e){alert(e);}

Комментариев нет: