Разработка
23
Мар
3

Вызов плагина по кнопке

Если почитаете SDK, то Вы там не найдете способа вызвать плагин по кнопке. Из этого можно сделать вывод, что вызвать плагин по кнопке нельзя. Но если его не читать, то это вполне можно попробовать реализовать 🙂 Итак, что нам известо о плагинах (отбросив не актуальную для данного поста информацию): их вызов регистрируется на определенное событие и на определенный объект. Следовательно, чтобы вызвать плагин нам нужно сгенерировать определенное событие, для определенного объекта. А чтобы не спутать наше событие с каким-либо другим, навесим на него не хитрый «идентификатор». Приступим:

  • Для начала создадим кнопку над представление (более подробно смотрите в статье Изменение интерфейса с помощью ISV.Config), по которой будет вызываться плагин. Выгрузите из CRM ISV.config и откройте его в каком нибудь текстовом редакторе. Добавьте, например, для представления какого-либо объекта такую кнопку:
    <Button Icon="/_imgs/ico_16_4406.gif" JavaScript="
    	// Prepare variables for a contact to retrieve.
    	var contactid = &quot;11111111-2222-3333-4444-555555555555&quot;;
    	var authenticationHeader = GenerateAuthenticationHeader();
    
    	// Prepare the SOAP message.
    	var xml = &quot;&lt;?xml version=&apos;1.0&apos; encoding=&apos;utf-8&apos;?&gt;&quot;+
    	&quot;&lt;soap:Envelope xmlns:soap=&apos;http://schemas.xmlsoap.org/soap/envelope/&apos;&quot;+
    	&quot; xmlns:xsi=&apos;http://www.w3.org/2001/XMLSchema-instance&apos;&quot;+
    	&quot; xmlns:xsd=&apos;http://www.w3.org/2001/XMLSchema&apos;&gt;&quot;+
    	authenticationHeader+
    	&quot;&lt;soap:Body&gt;&quot;+
    	&quot;&lt;Retrieve xmlns=&apos;http://schemas.microsoft.com/crm/2007/WebServices&apos;&gt;&quot;+
    	&quot;&lt;entityName&gt;contact&lt;/entityName&gt;&quot;+
    	&quot;&lt;id&gt;&quot;+contactid+&quot;&lt;/id&gt;&quot;+
    	&quot;&lt;columnSet xmlns:q1=&apos;http://schemas.microsoft.com/crm/2006/Query&apos; xsi:type=&apos;q1:ColumnSet&apos;&gt;&quot;+
    	&quot;&lt;q1:Attributes&gt;&quot;+
    	&quot;&lt;q1:Attribute&gt;fullname&lt;/q1:Attribute&gt;&quot;+
    	&quot;&lt;/q1:Attributes&gt;&quot;+
    	&quot;&lt;/columnSet&gt;&quot;+
    	&quot;&lt;/Retrieve&gt;&quot;+
    	&quot;&lt;/soap:Body&gt;&quot;+
    	&quot;&lt;/soap:Envelope&gt;&quot;;
    	// Prepare the xmlHttpObject and send the request.
    	var xHReq = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);
    	xHReq.Open(&quot;POST&quot;, &quot;/mscrmservices/2007/CrmService.asmx&quot;, false);
    	xHReq.setRequestHeader(&quot;SOAPAction&quot;,&quot;http://schemas.microsoft.com/crm/2007/WebServices/Retrieve&quot;);
    	xHReq.setRequestHeader(&quot;Content-Type&quot;, &quot;text/xml; charset=utf-8&quot;);
    	xHReq.setRequestHeader(&quot;Content-Length&quot;, xml.length);
    	xHReq.send(xml);
    ">
    	<Titles>
    		<Title LCID="1033" Text="Плагин ау!!!" />
    	</Titles>
    	<ToolTips>
    		<ToolTip LCID="1033" Text="Плагин ау!!!" />
    	</ToolTips>
    </Button>
    

    Эта кнопка оправляет в CRM Retrieve-запрос записи Контакта с определенным GUID’ом – «11111111-2222-3333-4444-555555555555», по которому мы будем отличать любой другой Retrieve-запрос от нашего.

  • Затем «рисуем» плагин с таким кодом:
    using System;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using System.IO;
    using System.Text;
    
    namespace MyPlugins
    {
        public class HelloWorldPlugin : IPlugin
        {
            public void Execute(IPluginExecutionContext context)
            {
                // Получаем GUID запрашиваемой записи
                Moniker entity = (Moniker)context.InputParameters.Properties[ParameterName.Target];
    
                // Если GUID равен определенному значению, то...
                if (entity.Id.ToString() == "11111111-2222-3333-4444-555555555555") 
                {
                    // Записываем GUID в файл
                    using (StreamWriter outfile = new StreamWriter(@"C:\test\AllTxtFiles.txt"))
                    {
                        outfile.Write(entity.Id.ToString());
                    }
                }
            }
        }
    }
    

    Этот код проверяет, что Retrieve-запрос (на котороый мы позже зарегистрируем плагин) запрашивает определенный GUID и в случае прохождения проверки записывает GUID в файл.

  • Регистрируем сборку в CRM. Для нее регистрируем шаг с такими параметрами:
    • Massage: Retrieve;
    • Primary Entity: Contact;
    • Eventing Pipiline Stage: Pre Stage.

    Остальныйе параметры оставьте по дефолту.

  • Тестируем: жмем кнопку и смотрим на сформированный файл 🙂




Комментарии (3)
  • Vladislav Osmanov 23.03.2010

    Очень хитрый способ; осталось найти задачу, которую он поможет решить : )

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

    Для такого сценария (запуск события из кнопки ISV.config) целесообразнее вызвать метод WCF-сервиса (а если метод пометить атрибутом [WebGet(UriTemplate = «/SubmitInvoice/{salesorderId}», BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)], то не придётся формировать тело запроса, просто вызываем определённый URL:
    var xmlHttp = new ActiveXObject(‘Microsoft.XMLHTTP’);

    xmlHttp.open(‘GET’, ‘http://crmserver:8765/SomeService/SubmitInvoice/’ + invoiceId, false);
    xmlHttp.setRequestHeader(‘Content-type’, ‘application/json’);
    xmlHttp.send(null);

    после чего делаем
    var response = eval( ‘(‘ + xmlHttp.responseText + ‘)’ );

    и в скрипте у нас десериализованный из JSON объект с ответом).

  • slivka_83 23.03.2010

    > осталось найти задачу, которую он поможет решить : )
    Ну, не знаю как насчет реальной задачи, но мне довадилось встречать такой вопрос на форумах 🙂 а если гипотетически, то в некоторых случаях замена ASPX-приложению 🙂

  • Dalaj 23.03.2010

    Вот вам пример — генерация счетов. Её нужно делать в асинхронном режиме, а из wcf сервиса такой job сделать проблематично (не нашёл как).

*

code