Программное изменение 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/