Разработка
06
Фев
0

Программное изменение SiteMap’а в CRM 2011

Содержимое сайтмапа может быть изменено с помощью веб-сервиса CRM 2011. Это может быть полезно если, например, решение устанавливается с помощью инсталлятора. Ниже для примера приведен код изменения SiteMap’а через консольное приложение:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
using System.ServiceModel.Description;
using System.Xml.Linq;
using Microsoft.Crm.Sdk.Messages;
using System.Runtime.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2011");
            Uri uri = new Uri("http://crm2011:5555/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            IOrganizationService service = (IOrganizationService)proxy;

            try
            {
                // Возвращаем SiteMap
                QueryExpression query = new QueryExpression();
                query.EntityName = "sitemap";
                query.ColumnSet = new ColumnSet(true);

                EntityCollection col = service.RetrieveMultiple(query);

                Entity siteMap = null;
                if (col != null && col.Entities.Count > 0)
                    siteMap = col.Entities[0];

                // Парсим SiteMap в объект XDocument
                string sitemapContent = siteMap["sitemapxml"].ToString();
                XDocument sitemapXml = XDocument.Parse(sitemapContent);

                // Создаем новую ссылку для левого навигацилнного меню
                XElement subArea = XElement.Parse(@"
                    <SubArea Id='nav_ya' Url='http://ru.wikipedia.org/' Icon='/_imgs/ico_16_8006.png'>
                        <Titles>
                            <Title LCID='1049' Title='Вики' />
                        </Titles>
                    </SubArea>"
                );

                // Находим в SiteMap'е группу MyWork и добавляем в нее ссылку
                foreach (XElement group in sitemapXml.Descendants("Group"))
                {
                    if (group.Attribute("Id").Value == "MyWork")
                    {
                        group.Add(subArea);
                        break;
                    }
                }

                // Обновляем SiteMap в CRM
                siteMap["sitemapxml"] = sitemapXml.ToString();
                service.Update(siteMap);

                // Публикуем SiteMap
                PublishXmlRequest request = new PublishXmlRequest();
                request.ParameterXml = "<importexportxml><sitemaps><sitemap></sitemap></sitemaps></importexportxml>";
                service.Execute(request);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            Console.WriteLine("SiteMap updated.");
            Console.WriteLine("Press <Enter> to exit.");
            Console.ReadLine();
        }
    }
}

В чем суть: нужно вытащить объект sitemap из CRM, с помощью XML методов .Net меняем XML-разметку и загружаем обратно в CRM/


Комментарии (0)

*

code