public override void ProcessMessage(BXCommand cmd, bool executionContext, string executionVirtualPath) { if (cmd.Action == "Bitrix.Search.ProvideUrl") { if (cmd.Parameters.Get<string>("moduleId") != "iblock") return; int iblockId = Parameters.Get("IBlockId", -1); if (iblockId < 0 || cmd.Parameters.Get<int>("itemGroup") != iblockId) return; int elementId = cmd.Parameters.Get("itemId", -1); if (elementId < 0) return; BXIBlockElement ibe = BXIBlockElement.GetById(elementId); BXIBlockSection ibs = null; if (ibe != null) foreach (int sid in ibe.Sections.ToList()) { ibs = BXIBlockSection.GetById(sid); if (ibs != null) break; } if (ibe == null || ibs == null) return; Results["SECTION_ID"] = ibs.Id; Results["ELEMENT_ID"] = ibe.Id; Results["SECTION_CODE"] = ibs.Code ?? string.Empty; Results["ELEMENT_CODE"] = ibe.Code ?? string.Empty; string url; if (Parameters.Get<bool>("EnableSEF")) url = MakeLink(Parameters.Get<string>("SEFFolder"), Parameters.Get<string>("SEF_URL_TEMPLATES_element", "#SECTION_ID#/#ELEMENT_ID#/")); else url = MakeLink(string.Format( "{0}?{1}=#SECTION_ID#&{2}=#ELEMENT_ID#", VirtualPathUtility.ToAbsolute(executionVirtualPath), Parameters.Get<string>("VARIABLE_ALIASES_SECTION_ID", "SECTION_ID"), Parameters.Get<string>("VARIABLE_ALIASES_ELEMENT_ID", "ELEMENT_ID") )); cmd.AddCommandResult("bitrix:catalog@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, url)); } if (cmd.Action == "Bitrix.Main.GeneratePublicMenu") { //Bitrix.Diagnostics.BXDump.ToFile( // String.Format( // "executionVirtualPath={0}, uriPath={1}, uri={2}, SefFolder={3}, GenerateMenuType={4}, menuType={5}", // executionVirtualPath, // cmd.Parameters.Get<string>("uriPath"), // cmd.Parameters.Get<string>("uri"), // Bitrix.IO.BXPath.ToVirtualRelativePath(SEFFolder.TrimStart('\\', '/')), // Parameters.Get("GenerateMenuType", "left"), // cmd.Parameters.Get<string>("menuType") // ) //); //if (!cmd.Parameters.Get<string>("uriPath").StartsWith(Bitrix.IO.BXPath.ToVirtualRelativePath(SEFFolder.TrimStart('\\', '/')) + "/", StringComparison.InvariantCultureIgnoreCase)) //return; //Генерируем меню только для тех адресов, которые выводит сам компонент. if (!Parameters.Get<bool>("EnableSEF") && !executionVirtualPath.Equals(cmd.Parameters.Get<string>("uriPath"), StringComparison.InvariantCultureIgnoreCase)) return; else if (Parameters.Get<bool>("EnableSEF") && !cmd.Parameters.Get<string>("uriPath").StartsWith(Bitrix.IO.BXPath.ToVirtualRelativePath(SEFFolder.TrimStart('\\', '/')) + "/", StringComparison.InvariantCultureIgnoreCase)) return; if (!Parameters.Get("GenerateMenuType", "left").Equals(cmd.Parameters.Get<string>("menuType"), StringComparison.InvariantCultureIgnoreCase)) return; int iblockId = Parameters.Get("IBlockId", -1); if (iblockId < 0) return; BXParamsBag<string> urlToPage = new BXParamsBag<string>(); BXParamsBag<object> request = new BXParamsBag<object>(); string PageKey = String.Empty; urlToPage.Add("ElementTOP", TOPElementURL.TrimEnd('/', '\\')); urlToPage.Add("SectionPage", SectionPageURL.TrimEnd('/', '\\')); urlToPage.Add("Element", ElementURL.TrimEnd('/', '\\')); urlToPage.Add("Section", SectionURL.TrimEnd('/', '\\')); if (EnableSef) { PageKey = MapVariable(SEFFolder, urlToPage, request, String.Empty, BXUri.ToRelativeUri(cmd.Parameters.Get<string>("uri"))); } else { BXParamsBag<string> variableAliases = new BXParamsBag<string>(); variableAliases.Add(ParamSectionId, AliasSectionId); variableAliases.Add(ParamElementId, AliasElementId); variableAliases.Add(ParamPageId, AliasPageId); variableAliases.Add(ParamSectionCode, AliasSectionCode); variableAliases.Add(ParamElementCode, AliasElementCode); MapVariable(variableAliases, request, BXUri.ToRelativeUri(cmd.Parameters.Get<string>("uri"))); } SectionId = request.Get(ParamSectionId, SectionId); ElementId = request.Get(ParamElementId, ElementId); PageId = request.Get(ParamPageId, PageId); ElementCode = request.Get(ParamElementCode, ElementCode); SectionCode = request.Get(ParamSectionCode, SectionCode); List<BXPublicMenuItem> resultList = null; string parentLevelUri = null; if (ElementId > 0 || !String.IsNullOrEmpty(ElementCode)) { if (SectionId > 0 || !String.IsNullOrEmpty(SectionCode)) { BXParamsBag<object> p = new BXParamsBag<object>(); p["SECTION_ID"] = SectionId; p["SECTION_CODE"] = SectionCode; parentLevelUri = MakeMenuUri(executionVirtualPath, p); } else { BXFilter elFilter = new BXFilter( new BXFilterItem(BXIBlockElement.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockElement.Fields.ActiveDate, BXSqlFilterOperators.Equal, "Y") ); if (ElementId > 0) elFilter.Add(new BXFilterItem(BXIBlockElement.Fields.ID, BXSqlFilterOperators.Equal, ElementId)); else elFilter.Add(new BXFilterItem(BXIBlockElement.Fields.Code, BXSqlFilterOperators.Equal, ElementCode)); BXIBlockElementCollection collElement = BXIBlockElement.GetList(elFilter, null); if (collElement != null) { if (collElement.Count > 0) { BXIBlockElement.BXInfoBlockElementSectionCollection es = collElement[0].Sections; if (es != null) { if (es.Count > 0) { SectionId = es[0].SectionId; BXParamsBag<object> p = new BXParamsBag<object>(); p["SECTION_ID"] = SectionId; if (Parameters.Get<bool>("EnableSEF") && SectionURL.Contains("#SECTION_CODE#")) { BXIBlockSectionCollection collSection = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.ID, BXSqlFilterOperators.Equal, SectionId), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, iblockId) ), null ); if (collSection != null) { if (collSection.Count > 0) { SectionCode = collSection[0].Code; p["SECTION_CODE"] = SectionCode; } } } parentLevelUri = MakeMenuUri(executionVirtualPath, p); } } } } } } if (parentLevelUri == null) { if (SectionId > 0 || !String.IsNullOrEmpty(SectionCode)) { int parentSectionId = 0; bool parentSectionFound = false; if (SectionId <= 0) { BXIBlockSectionCollection coll = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.Code, BXSqlFilterOperators.Equal, SectionCode), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, iblockId) ), null ); if (coll != null) { if (coll.Count > 0) { SectionId = coll[0].Id; parentSectionId = coll[0].SectionId; parentSectionFound = true; } } } if (SectionId > 0) { BXIBlockSectionCollection coll = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.SectionId, BXSqlFilterOperators.Equal, SectionId), new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, iblockId) ), new BXOrderBy( new BXOrderByPair(BXIBlockSection.Fields.Sort, BXOrderByDirection.Asc), new BXOrderByPair(BXIBlockSection.Fields.Name, BXOrderByDirection.Asc) ) ); resultList = ExtractMenuItemsFromCollection(executionVirtualPath, resultList, coll); if (resultList == null) { if (!parentSectionFound) { coll = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.ID, BXSqlFilterOperators.Equal, SectionId), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, iblockId) ), null ); if (coll != null) { if (coll.Count > 0) { parentSectionFound = true; parentSectionId = coll[0].SectionId; } } } if (parentSectionFound && parentSectionId > 0) { BXParamsBag<object> p = new BXParamsBag<object>(); p["SECTION_ID"] = parentSectionId; if (Parameters.Get<bool>("EnableSEF") && SectionURL.Contains("#SECTION_CODE#")) { coll = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.ID, BXSqlFilterOperators.Equal, parentSectionId), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, iblockId) ), null ); if (coll != null) { if (coll.Count > 0) p["SECTION_CODE"] = coll[0].Code; } } parentLevelUri = MakeMenuUri(executionVirtualPath, p); } else { if (Parameters.Get<bool>("EnableSEF")) parentLevelUri = MakeLink(Parameters.Get<string>("SEFFolder"), ""); else parentLevelUri = BXUri.ToAppRelativeUri(executionVirtualPath); } } } } } if (parentLevelUri == null) { if (resultList == null) { BXIBlockSectionCollection coll = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.SectionId, BXSqlFilterOperators.Equal, null), new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, iblockId) ), new BXOrderBy( new BXOrderByPair(BXIBlockSection.Fields.Sort, BXOrderByDirection.Asc), new BXOrderByPair(BXIBlockSection.Fields.Name, BXOrderByDirection.Asc) ) ); resultList = ExtractMenuItemsFromCollection(executionVirtualPath, resultList, coll); } } BXPublicMenu.BXLoadMenuCommandParameter r = new BXPublicMenu.BXLoadMenuCommandParameter(resultList, true, parentLevelUri); cmd.AddCommandResult("bitrix:catalog@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, r)); } }
public override void ProcessMessage(BXCommand cmd, bool executionContext, string executionVirtualPath) { if (cmd.Action == "Bitrix.Main.GeneratePublicMenu") { //Совпадает ли тип меню в параметрах компонента с типом, который запрашивает система. if (!Parameters.Get("GenerateMenuType", "left").Equals(cmd.Parameters.Get<string>("menuType"), StringComparison.InvariantCultureIgnoreCase)) return; //Генерируем меню только для тех адресов, которые выводит сам компонент. if (!EnableSef && !BXSiteRemapUtility.UnmapVirtualPath(executionVirtualPath).Equals(cmd.Parameters.Get<string>("uriPath"), StringComparison.InvariantCultureIgnoreCase)) return; else if (EnableSef && !cmd.Parameters.Get<string>("uriPath").StartsWith(Bitrix.IO.BXPath.ToVirtualRelativePath(SefFolder.TrimStart('\\', '/')) + "/", StringComparison.InvariantCultureIgnoreCase)) return; if (IBlockId < 0) return; BXParamsBag<object> request = new BXParamsBag<object>(); if (EnableSef) { BXParamsBag<string> urlToPage = new BXParamsBag<string>(); urlToPage["index.page"] = CommonListPageTemplate; urlToPage["index.all"] = CommonListShowAllTemplate; urlToPage["list"] = ElementListTemplate; urlToPage["list.page"] = SectionListPageTemplate; urlToPage["list.all"] = SectionListShowAllTemplate; urlToPage["detail"] = ElementDetailTemplate; MapVariable(SefFolder, urlToPage, request, "index", BXUri.ToRelativeUri(cmd.Parameters.Get<string>("uri"))); } else { BXParamsBag<string> variableAlias = new BXParamsBag<string>(); variableAlias["SectionId"] = SectionIdVariable; variableAlias["ElementId"] = ElementIdVariable; variableAlias["PageId"] = PageIdVariable; variableAlias["ShowAll"] = ShowAllVariable; MapVariable(variableAlias, request, BXUri.ToRelativeUri(cmd.Parameters.Get<string>("uri"))); } #region Menu Item Permission string permissionCacheKey = "mediaGallery-" + IBlockId.ToString() + "-menu-permission"; if ((menuItemPermisson = (string)BXCacheManager.MemoryCache.Get(permissionCacheKey)) == null) { menuItemPermisson = string.Empty; StringBuilder menuItemRoles = new StringBuilder(); BXRoleCollection iblockRoles = BXRoleManager.GetAllRolesForOperation("IBlockRead", "iblock", IBlockId.ToString()); foreach (BXRole role in iblockRoles) { //Если доступно всем if (role.RoleName == "Guest") { menuItemRoles = null; break; } //Если доступно группе User, значит достаточно проверить только для этой группы else if (role.RoleName == "User") { menuItemRoles = null; menuItemPermisson = "User"; break; } else { menuItemRoles.Append(role.RoleName); menuItemRoles.Append(";"); } } if (menuItemRoles != null && menuItemRoles.Length > 0) menuItemPermisson = menuItemRoles.ToString(); BXCacheManager.MemoryCache.Insert(permissionCacheKey, menuItemPermisson); } #endregion int elementId = 0, sectionId = 0; string elementCode = String.Empty, sectionCode = String.Empty; elementId = request.Get<int>("ElementId", elementId); sectionId = request.Get<int>("SectionId", sectionId); elementCode = request.Get<string>("ElementCode", elementCode); sectionCode = request.Get<string>("SectionCode", sectionCode); string parentLevelUri = null; List<BXPublicMenuItem> menuList = null; //Указан идентификатор или символьный код if (elementId > 0 || !String.IsNullOrEmpty(elementCode)) { BXFilter elementFilter = new BXFilter( new BXFilterItem(BXIBlockElement.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId), new BXFilterItem(BXIBlockElement.Fields.Active, BXSqlFilterOperators.Equal, "Y") ); if (elementId > 0) elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.ID, BXSqlFilterOperators.Equal, elementId)); if (!String.IsNullOrEmpty(elementCode)) elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.Code, BXSqlFilterOperators.Equal, elementCode)); if (sectionId > 0) elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.Sections.Section.SectionId, BXSqlFilterOperators.Equal, sectionId)); if (!String.IsNullOrEmpty(sectionCode)) elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.Sections.Section.Code, BXSqlFilterOperators.Equal, sectionCode)); BXIBlockElementCollection element = BXIBlockElement.GetList(elementFilter, null); if (element != null && element.Count > 0) { BXIBlockElement.BXInfoBlockElementSectionCollection sections = element[0].Sections; if (sections != null && sections.Count > 0) { BXParamsBag<object> replaceItems = new BXParamsBag<object>(); replaceItems["SectionId"] = sections[0].SectionId; replaceItems["SectionCode"] = GetSectionCode(sections[0].SectionId); parentLevelUri = MakeMenuUriForElementList(executionVirtualPath, replaceItems); //Меню строится для раздела, к которому привязан элемент } } } //Если ничего не указано выводим все дерево Dictionary<string, BXPublicMenu.BXLoadMenuCommandParameter> menuTree = new Dictionary<string, BXPublicMenu.BXLoadMenuCommandParameter>(); if (parentLevelUri == null && menuList == null) { BXIBlockSectionCollection sectionsList = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId) ), new BXOrderBy( new BXOrderByPair(BXIBlockSection.Fields.LeftMargin, BXOrderByDirection.Asc) ) ); int previousDepthLevel = 1; int previousSectionId = 0; Dictionary<int, MenuSectionTree> sectionTree = new Dictionary<int, MenuSectionTree>(); foreach (BXIBlockSection section in sectionsList) { BXParamsBag<object> replaceItems = new BXParamsBag<object>(); replaceItems["SectionId"] = section.Id; replaceItems["SectionCode"] = section.Code ?? String.Empty; sectionTree[section.Id] = new MenuSectionTree(); string url = MakeMenuUriForElementList(executionVirtualPath, replaceItems); sectionTree[section.Id].url = url; sectionTree[section.Id].sectionId = section.SectionId; //Если предыдущий раздел не имеет вложенных (дочерних) разделов, то для него дополнительно указывается URL на родительскую секцию (и эл-ты меню для данной секции будут запрошены из этой родительской) if (previousSectionId > 0 && section.DepthLevel <= previousDepthLevel) sectionTree[previousSectionId].parentLevelUrl = sectionTree[sectionTree[previousSectionId].sectionId].url; previousDepthLevel = section.DepthLevel; previousSectionId = section.Id; BXPublicMenuItem menuItem = new BXPublicMenuItem(); menuItem.Title = section.Name; menuItem.Links.Add(url); menuItem.Sort = section.LeftMargin; if (!String.IsNullOrEmpty(menuItemPermisson)) { menuItem.ConditionType = ConditionType.Group; menuItem.Condition = menuItemPermisson; } if (!sectionTree.ContainsKey(section.SectionId)) { sectionTree[section.SectionId] = new MenuSectionTree(); sectionTree[section.SectionId].menuItems = new List<BXPublicMenuItem>(); if (section.SectionId < 1) sectionTree[section.SectionId].url = EnableSef ? SefFolder : BXUri.ToAppRelativeUri(executionVirtualPath); } if (sectionTree[section.SectionId].menuItems == null) sectionTree[section.SectionId].menuItems = new List<BXPublicMenuItem>(); sectionTree[section.SectionId].menuItems.Add(menuItem); } //Последний раздел точно не имеет вложенных (дочерних) разделов, для него обязательно указывается URL на родительскую секцию (и эл-ты меню для данной секции будут запрошены из этой родительской) if (sectionTree.ContainsKey(previousSectionId) && sectionTree.ContainsKey(sectionTree[previousSectionId].sectionId)) sectionTree[previousSectionId].parentLevelUrl = sectionTree[sectionTree[previousSectionId].sectionId].url; foreach (KeyValuePair<int, MenuSectionTree> sectionItem in sectionTree) menuTree.Add( sectionItem.Value.url, new BXPublicMenu.BXLoadMenuCommandParameter(sectionItem.Value.menuItems, true, sectionItem.Value.parentLevelUrl) ); } if (menuTree.Count > 0) cmd.AddCommandResult("bitrix:mediaGallery@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, menuTree)); else if (menuList != null || parentLevelUri != null) { BXPublicMenu.BXLoadMenuCommandParameter menuResult = new BXPublicMenu.BXLoadMenuCommandParameter(menuList, true, parentLevelUri); cmd.AddCommandResult("bitrix:mediaGallery@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, menuResult)); } } }
public override void ProcessMessage(BXCommand cmd, bool executionContext, string executionVirtualPath) { #region Search if (cmd.Action == "Bitrix.Search.ProvideUrl") { string moduleId = cmd.Parameters.Get("moduleId", string.Empty); if (string.Equals(moduleId, "forum", StringComparison.OrdinalIgnoreCase) && AllowComments && BXModuleManager.IsModuleInstalled("Forum")) { //Поиск по комментариям к новостям int blockId = IBlockId; int forumId = cmd.Parameters.GetInt("itemGroup", 0); int postId = cmd.Parameters.GetInt("itemId", 0); int topicId = cmd.Parameters.GetInt("param1"); if (blockId == 0 || !string.Equals(moduleId, "forum", StringComparison.OrdinalIgnoreCase) || forumId <= 0 || postId <= 0) return; BXFilter f = new BXFilter( new BXFilterItem(BXIBlockElement.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockElement.Fields.ActiveDate, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockElement.Fields.IBlock.ID, BXSqlFilterOperators.Equal, blockId), new BXFilterItem(BXIBlockElement.Fields.CustomFields[blockId].GetFieldByKey(CommentCustomPropertyName), BXSqlFilterOperators.Equal, topicId) ); string siteId = DesignerSite; if (!string.IsNullOrEmpty(siteId)) f.Add(new BXFilterItem(BXIBlockElement.Fields.IBlock.Sites.SiteId, BXSqlFilterOperators.Equal, siteId)); BXIBlockElementCollection c = BXIBlockElement.GetList(f, null); if (c.Count == 0) return; BXIBlockElement el = c[0]; //формируем постоянную ссылку на комментарий string commentUrl = string.Empty; if (!EnableSef) commentUrl = string.Format("{0}?{1}={2}&{3}={4}#comment{4}", BXSite.GetUrlForPath(executionVirtualPath, null, cmd.SiteId), ParamNews, el.Id.ToString(), ParamComment, postId.ToString()); else { BXParamsBag<object> commentSefParams = new BXParamsBag<object>(); commentSefParams["SectionId"] = string.Empty; commentSefParams["ElementId"] = el.Id.ToString(); commentSefParams["CommentId"] = postId.ToString(); string t = SefDetailCommentRead; if (t.IndexOf("##") < 0) t = string.Concat(t, "##comment#CommentId#"); commentUrl = BXSefUrlUtility.MakeLink(CombineLink(SefFolder, t), commentSefParams).Replace("//", "/"); } cmd.AddCommandResult(string.Concat("bitrix:forum@", executionVirtualPath), new BXCommandResult(BXCommandResultType.Ok, commentUrl)); return; } if (!string.Equals(moduleId, "iblock", StringComparison.OrdinalIgnoreCase)) return; if (IBlockId < 0 || cmd.Parameters.Get<int>("itemGroup") != IBlockId) return; int elementId = cmd.Parameters.Get("itemId", -1); if (elementId < 0) return; BXIBlockElement elm = BXIBlockElement.GetById(elementId); if (elm == null) return; BXParamsBag<object> p = new BXParamsBag<object>(); p.Add("ElementId", elementId); p.Add("SectionId", elm.Sections.Count > 0 ? elm.Sections[0].SectionId.ToString() : String.Empty); string url; if (EnableSef) { url = MakeLink(SefFolder, SefNews, p); if (elm.Sections.Count == 0) url = url.Replace("//", "/"); } else url = MakeLink(string.Format("{0}?{1}=#ElementId#", BXSite.GetUrlForPath(executionVirtualPath, null, cmd.SiteId), ParamNews), p); cmd.AddCommandResult("bitrix:news@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, url)); } #endregion if (cmd.Action == "Bitrix.Main.GeneratePublicMenu") { //Совпадает ли тип меню в параметрах компонента с типом, который запрашивает система. if (!Parameters.Get("GenerateMenuType", "left").Equals(cmd.Parameters.Get<string>("menuType"), StringComparison.InvariantCultureIgnoreCase)) return; //Генерируем меню только для тех адресов, которые выводит сам компонент. if (!Parameters.Get<bool>("EnableSEF") && !BXSiteRemapUtility.UnmapVirtualPath(executionVirtualPath).Equals(cmd.Parameters.Get<string>("uriPath"), StringComparison.InvariantCultureIgnoreCase)) return; else if (Parameters.Get<bool>("EnableSEF") && !cmd.Parameters.Get<string>("uriPath").StartsWith(Bitrix.IO.BXPath.ToVirtualRelativePath(SefFolder.TrimStart('\\', '/')) + "/", StringComparison.InvariantCultureIgnoreCase)) return; if (IBlockId < 0) return; BXParamsBag<object> request = new BXParamsBag<object>(); BXParamsBag<string> urlToPage = new BXParamsBag<string>(); if (EnableSef) { urlToPage["detail"] = SefNews; urlToPage["section"] = SefSection; urlToPage["news.page"] = SefPage; urlToPage["news.showall"] = SefShowAll; urlToPage["rss"] = Parameters.Get("Sef_Rss", String.Empty); urlToPage["sectionrss"] = Parameters.Get("Sef_Rss_Section", String.Empty); MapVariable(SefFolder, urlToPage, request, String.Empty, BXUri.ToRelativeUri(cmd.Parameters.Get<string>("uri"))); } else { BXParamsBag<string> variableAlias = new BXParamsBag<string>(); variableAlias["ElementId"] = ParamNews; variableAlias["SectionId"] = ParamSection; MapVariable(variableAlias, request, BXUri.ToRelativeUri(cmd.Parameters.Get<string>("uri"))); } //Определим уровень доступа пунктов if ((menuItemPermisson = (string)BXCacheManager.MemoryCache.Get(PermissionCacheKey)) == null) { menuItemPermisson = String.Empty; StringBuilder menuItemRoles = new StringBuilder(); if (Parameters.Get<bool>("UsePermissions")) { foreach (string permission in Parameters.GetList("GroupPermissions", new List<object>())) { menuItemRoles.Append(permission); menuItemRoles.Append(";"); } if (menuItemRoles.Length > 0) menuItemRoles.Append("Admin"); } else { BXRoleCollection iblockRoles = BXRoleManager.GetAllRolesForOperation("IBlockRead", "iblock", IBlockId.ToString()); foreach (BXRole role in iblockRoles) { //Если доступно всем if (role.RoleName == "Guest") { menuItemRoles = null; break; } //Если доступно группе User, значит достаточно проверить только для этой группы else if (role.RoleName == "User") { menuItemRoles = null; menuItemPermisson = "User"; break; } else { menuItemRoles.Append(role.RoleName); menuItemRoles.Append(";"); } } } if (menuItemRoles != null && menuItemRoles.Length > 0) menuItemPermisson = menuItemRoles.ToString(); BXCacheManager.MemoryCache.Insert(PermissionCacheKey, menuItemPermisson); } int elementId = 0, sectionId = 0; elementId = request.Get<int>("ElementId", elementId); sectionId = request.Get<int>("SectionId", sectionId); string parentLevelUri = null; List<BXPublicMenuItem> menuList = null; if (elementId > 0 && sectionId > 0) { parentLevelUri = MakeMenuUri(executionVirtualPath, sectionId); } //Если указан только элемент else if (elementId > 0) { BXFilter elementFilter = new BXFilter( new BXFilterItem(BXIBlockElement.Fields.ID, BXSqlFilterOperators.Equal, elementId), new BXFilterItem(BXIBlockElement.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId) ); if (Parameters.Get<bool>("ShowActiveElements", true)) { elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.Active, BXSqlFilterOperators.Equal, "Y")); elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.ActiveDate, BXSqlFilterOperators.Equal, "Y")); } BXIBlockElementCollection element = BXIBlockElement.GetList(elementFilter, null); if (element != null && element.Count > 0) { BXIBlockElement.BXInfoBlockElementSectionCollection sections = element[0].Sections; if (sections != null && sections.Count > 0) { sectionId = sections[0].SectionId; parentLevelUri = MakeMenuUri(executionVirtualPath, sectionId); //Меню строится для раздела, к которому привязан элемент } } } //Если указан раздел выводим его дочерние разделы if (parentLevelUri == null && sectionId > 0) { BXIBlockSectionCollection sectionList = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId), new BXFilterItem(BXIBlockSection.Fields.SectionId, BXSqlFilterOperators.Equal, sectionId) ), new BXOrderBy( new BXOrderByPair(BXIBlockSection.Fields.Sort, BXOrderByDirection.Asc), new BXOrderByPair(BXIBlockSection.Fields.Name, BXOrderByDirection.Asc) ) ); menuList = ExtractMenuItemsFromCollection(sectionList, executionVirtualPath); //Если нет дочерних разделов, то меню строится для родителя указанного раздела if (menuList == null) { sectionList = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId), new BXFilterItem(BXIBlockSection.Fields.ID, BXSqlFilterOperators.Equal, sectionId) ), new BXOrderBy( new BXOrderByPair(BXIBlockSection.Fields.Sort, BXOrderByDirection.Asc), new BXOrderByPair(BXIBlockSection.Fields.Name, BXOrderByDirection.Asc) ) ); if (sectionList != null && sectionList.Count > 0 && sectionList[0].SectionId > 0) { parentLevelUri = MakeMenuUri(executionVirtualPath, sectionList[0].SectionId); } else { //Если такой раздел не существует или это раздел корневой (нет родителя) if (Parameters.Get<bool>("EnableSEF")) parentLevelUri = SefFolder; else parentLevelUri = BXSiteRemapUtility.UnmapVirtualPath(executionVirtualPath); } } } //Если ничего не указано выводим корневые разделы Dictionary<string, BXPublicMenu.BXLoadMenuCommandParameter> menuTree = new Dictionary<string, BXPublicMenu.BXLoadMenuCommandParameter>(); if (parentLevelUri == null && menuList == null) { /*BXIBlockSectionCollection sectionList = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId), new BXFilterItem(BXIBlockSection.Fields.SectionId, BXSqlFilterOperators.Equal, null) ), new BXOrderBy( new BXOrderByPair(BXIBlockSection.Fields.Sort, BXOrderByDirection.Asc), new BXOrderByPair(BXIBlockSection.Fields.Name, BXOrderByDirection.Asc) ) ); menuList = ExtractMenuItemsFromCollection(sectionList, executionVirtualPath); */ BXIBlockSectionCollection sectionsList = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId) ), new BXOrderBy( new BXOrderByPair(BXIBlockSection.Fields.LeftMargin, BXOrderByDirection.Asc), new BXOrderByPair(BXIBlockSection.Fields.Sort, BXOrderByDirection.Asc), new BXOrderByPair(BXIBlockSection.Fields.Name, BXOrderByDirection.Asc) ) ); Dictionary<int, List<BXPublicMenuItem>> sectionTree = new Dictionary<int, List<BXPublicMenuItem>>(); foreach (BXIBlockSection section in sectionsList) { if (!sectionTree.ContainsKey(section.SectionId)) sectionTree.Add(section.SectionId, new List<BXPublicMenuItem>()); BXPublicMenuItem menuItem = new BXPublicMenuItem(); menuItem.Title = section.Name; menuItem.Links.Add(MakeMenuUri(executionVirtualPath, section.Id)); menuItem.Sort = section.Sort; if (!String.IsNullOrEmpty(menuItemPermisson)) { menuItem.ConditionType = ConditionType.Group; menuItem.Condition = menuItemPermisson; } sectionTree[section.SectionId].Add(menuItem); } foreach (KeyValuePair<int, List<BXPublicMenuItem>> submenuList in sectionTree) { string url = null; if (submenuList.Key > 0) { url = MakeMenuUri(executionVirtualPath, submenuList.Key); } else { if (Parameters.Get<bool>("EnableSEF")) url = SefFolder; else url = BXSiteRemapUtility.UnmapVirtualPath(executionVirtualPath); } menuTree.Add(url, new BXPublicMenu.BXLoadMenuCommandParameter(submenuList.Value, true, null)); } } if (menuTree.Count > 0) cmd.AddCommandResult("bitrix:news@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, menuTree)); else { BXPublicMenu.BXLoadMenuCommandParameter menuResult = new BXPublicMenu.BXLoadMenuCommandParameter(menuList, true, parentLevelUri); cmd.AddCommandResult("bitrix:news@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, menuResult)); } } }
public override void ProcessMessage(BXCommand cmd, bool executionContext, string executionVirtualPath) { #region Search if (cmd.Action == "Bitrix.Search.ProvideUrl") { string moduleId = cmd.Parameters.Get("moduleId", string.Empty); if (string.Equals(moduleId, "forum", StringComparison.OrdinalIgnoreCase) && AboutCommentsShow() && BXModuleManager.IsModuleInstalled("Forum")) { //Поиск по комментариям к эл-там каталога int blockId = IBlockId; int forumId = cmd.Parameters.GetInt("itemGroup", 0); int postId = cmd.Parameters.GetInt("itemId", 0); int topicId = cmd.Parameters.GetInt("param1"); if (blockId == 0 || !string.Equals(moduleId, "forum", StringComparison.OrdinalIgnoreCase) || forumId <= 0 || postId <= 0) return; BXSchemeFieldBase commentCpField = BXIBlockElement.Fields.CustomFields[blockId].GetFieldByKey(CommentCustomPropertyName); if (commentCpField == null) return; BXFilter f = new BXFilter( new BXFilterItem(BXIBlockElement.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockElement.Fields.ActiveDate, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockElement.Fields.IBlock.ID, BXSqlFilterOperators.Equal, blockId), new BXFilterItem(commentCpField, BXSqlFilterOperators.Equal, topicId) ); string siteId = DesignerSite; if (!string.IsNullOrEmpty(siteId)) f.Add(new BXFilterItem(BXIBlockElement.Fields.IBlock.Sites.SiteId, BXSqlFilterOperators.Equal, siteId)); BXIBlockElementCollection c = BXIBlockElement.GetList(f, null); if (c.Count == 0) return; BXIBlockElement el = c[0]; //формируем постоянную ссылку на комментарий string commentUrl = string.Empty; if (!EnableSef) commentUrl = string.Format("{0}?{1}={2}&{3}={4}#comment{4}", BXSite.GetUrlForPath(executionVirtualPath, null), ElementIdVariable, el.Id.ToString(), CommentVariable, postId.ToString()); else { BXParamsBag<object> commentSefParams = new BXParamsBag<object>(); commentSefParams["SectionId"] = string.Empty; commentSefParams["ElementId"] = el.Id.ToString(); commentSefParams["CommentId"] = postId.ToString(); string t = ElementDetailCommentReadTemplate; if (t.IndexOf("##") < 0) t = string.Concat(t, "##comment#CommentId#"); commentUrl = BXSefUrlUtility.MakeLink(CombineLink(SefFolder, t), commentSefParams).Replace("//", "/"); } cmd.AddCommandResult(string.Concat("bitrix:forum@", executionVirtualPath), new BXCommandResult(BXCommandResultType.Ok, commentUrl)); return; } if (cmd.Parameters.Get<string>("moduleId") != "iblock") return; if (IBlockId < 0 || cmd.Parameters.Get<int>("itemGroup") != IBlockId) return; int elementId = cmd.Parameters.Get("itemId", -1); if (elementId < 0) return; BXFilter elementFilter = new BXFilter( new BXFilterItem(BXIBlockElement.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockElement.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId), new BXFilterItem(BXIBlockElement.Fields.ID, BXSqlFilterOperators.Equal, elementId) ); BXIBlockElementCollection element = BXIBlockElement.GetList(elementFilter, null); if (element != null && element.Count < 1) return; BXIBlockElement iblockElement = element[0]; int replaceSectionId = 0; if (iblockElement.Sections.Count != 0) replaceSectionId = iblockElement.Sections[0].SectionId; string url; if (EnableSef) { string replaceSectionCode = String.Empty; if (ElementDetailTemplate.Contains("#SECTION_CODE#") || ElementDetailTemplate.Contains("#SectionCode#")) { BXIBlockSection elementSection = BXIBlockSection.GetById(replaceSectionId); if (elementSection != null) replaceSectionCode = elementSection.Code; } BXParamsBag<object> replaceItems = new BXParamsBag<object>(); replaceItems.Add("IblockId", iblockElement.IBlockId); replaceItems.Add("IBLOCK_ID", iblockElement.IBlockId); replaceItems.Add("ELEMENT_ID", iblockElement.Id); replaceItems.Add("ElementId", iblockElement.Id); replaceItems.Add("ElementCode", iblockElement.Code); replaceItems.Add("ELEMENT_CODE", iblockElement.Code); replaceItems.Add("SectionId", replaceSectionId); replaceItems.Add("SECTION_ID", replaceSectionId); replaceItems.Add("SectionCode", replaceSectionCode); replaceItems.Add("SECTION_CODE", replaceSectionCode); //url = MakeLink(SefFolder, ElementDetailTemplate, replaceItems); url = CombineLink(SefFolder, BXSefUrlUtility.MakeLink(ElementDetailTemplate, replaceItems)); } else { url = String.Format("{0}?{1}={2}&{3}={4}", BXSite.GetUrlForPath(executionVirtualPath, null), SectionIdVariable, replaceSectionId, ElementIdVariable, elementId); } cmd.AddCommandResult("bitrix:catalogue@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, url)); } #endregion if (cmd.Action == "Bitrix.Main.GeneratePublicMenu") { //return; //Совпадает ли тип меню в параметрах компонента с типом, который запрашивает система. if (!Parameters.Get("GenerateMenuType", "left").Equals(cmd.Parameters.Get<string>("menuType"), StringComparison.InvariantCultureIgnoreCase)) return; //Генерируем меню только для тех адресов, которые выводит сам компонент. if (!EnableSef && !BXSiteRemapUtility.UnmapVirtualPath(executionVirtualPath).Equals(cmd.Parameters.Get<string>("uriPath"), StringComparison.InvariantCultureIgnoreCase)) return; else if (EnableSef && !cmd.Parameters.Get<string>("uriPath").StartsWith(Bitrix.IO.BXPath.ToVirtualRelativePath(SefFolder.TrimStart('\\', '/')) + "/", StringComparison.InvariantCultureIgnoreCase)) return; if (IBlockId < 0) return; BXParamsBag<object> request = new BXParamsBag<object>(); if (EnableSef) { BXParamsBag<string> urlToPage = new BXParamsBag<string>(); urlToPage["index.page"] = CommonListPageTemplate; urlToPage["index.all"] = CommonListShowAllTemplate; urlToPage["list"] = ElementListTemplate; urlToPage["list.page"] = SectionListPageTemplate; urlToPage["list.all"] = SectionListShowAllTemplate; urlToPage["detail"] = ElementDetailTemplate; //MapVariable(SefFolder, urlToPage, request, "index", BXUri.ToRelativeUri(cmd.Parameters.Get<string>("uri"))); Uri url = new Uri(BXUri.ToAbsoluteUri(cmd.Parameters.Get<string>("uri"))); BXSefUrlUtility.MapVariable(SefFolder, urlToPage, request, "index", url, null); ParseVariableAliases(request); } else { BXParamsBag<string> variableAlias = new BXParamsBag<string>(); variableAlias["SectionId"] = SectionIdVariable; variableAlias["ElementId"] = ElementIdVariable; variableAlias["PageId"] = PageIdVariable; variableAlias["ShowAll"] = ShowAllVariable; MapVariable(variableAlias, request, BXUri.ToRelativeUri(cmd.Parameters.Get<string>("uri"))); } #region Menu Item Permission string permissionCacheKey = "catalogue-" + IBlockId.ToString() + "-menu-permission"; if ((menuItemPermisson = (string)BXCacheManager.MemoryCache.Get(permissionCacheKey)) == null) { menuItemPermisson = String.Empty; StringBuilder menuItemRoles = new StringBuilder(); BXRoleCollection iblockRoles = BXRoleManager.GetAllRolesForOperation("IBlockRead", "iblock", IBlockId.ToString()); foreach (BXRole role in iblockRoles) { //Если доступно всем if (role.RoleName == "Guest") { menuItemRoles = null; break; } //Если доступно группе User, значит достаточно проверить только для этой группы else if (role.RoleName == "User") { menuItemRoles = null; menuItemPermisson = "User"; break; } else { menuItemRoles.Append(role.RoleName); menuItemRoles.Append(";"); } } if (menuItemRoles != null && menuItemRoles.Length > 0) menuItemPermisson = menuItemRoles.ToString(); BXCacheManager.MemoryCache.Insert(permissionCacheKey, menuItemPermisson); } #endregion int elementId = 0, sectionId = 0; string elementCode = String.Empty, sectionCode = String.Empty; elementId = request.Get<int>("ElementId", elementId); sectionId = request.Get<int>("SectionId", sectionId); elementCode = request.Get<string>("ElementCode", elementCode); sectionCode = request.Get<string>("SectionCode", sectionCode); string parentLevelUri = null; List<BXPublicMenuItem> menuList = null; //Указан идентификатор или символьный код if (elementId > 0 || !String.IsNullOrEmpty(elementCode)) { BXFilter elementFilter = new BXFilter( new BXFilterItem(BXIBlockElement.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId), new BXFilterItem(BXIBlockElement.Fields.Active, BXSqlFilterOperators.Equal, "Y") ); if (elementId > 0) elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.ID, BXSqlFilterOperators.Equal, elementId)); if (!String.IsNullOrEmpty(elementCode)) elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.Code, BXSqlFilterOperators.Equal, elementCode)); if (sectionId > 0) elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.Sections.Section.ID, BXSqlFilterOperators.Equal, sectionId)); if (!String.IsNullOrEmpty(sectionCode)) elementFilter.Add(new BXFilterItem(BXIBlockElement.Fields.Sections.Section.Code, BXSqlFilterOperators.Equal, sectionCode)); BXIBlockElementCollection element = BXIBlockElement.GetList(elementFilter, null); if (element != null && element.Count > 0) { BXIBlockElement.BXInfoBlockElementSectionCollection sections = element[0].Sections; if (sections != null && sections.Count > 0) { BXParamsBag<object> replaceItems = new BXParamsBag<object>(); replaceItems["SECTION_ID"] = sections[0].SectionId; replaceItems["SectionId"] = replaceItems["SECTION_ID"]; replaceItems["SECTION_CODE"] = GetSectionCode(sections[0].SectionId); replaceItems["SectionCode"] = replaceItems["SECTION_CODE"]; parentLevelUri = MakeMenuUri(executionVirtualPath, replaceItems); //Меню строится для раздела, к которому привязан элемент } } } //Если ничего не указано выводим все дерево Dictionary<string, BXPublicMenu.BXLoadMenuCommandParameter> menuTree = new Dictionary<string, BXPublicMenu.BXLoadMenuCommandParameter>(); if (parentLevelUri == null && menuList == null) { BXIBlockSectionCollection sectionsList = BXIBlockSection.GetList( new BXFilter( new BXFilterItem(BXIBlockSection.Fields.Active, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.ActiveGlobal, BXSqlFilterOperators.Equal, "Y"), new BXFilterItem(BXIBlockSection.Fields.IBlock.ID, BXSqlFilterOperators.Equal, IBlockId) ), new BXOrderBy( new BXOrderByPair(BXIBlockSection.Fields.LeftMargin, BXOrderByDirection.Asc) ), null, null, BXTextEncoder.EmptyTextEncoder ); int previousDepthLevel = 1; int previousSectionId = 0; Dictionary<int, MenuSectionTree> sectionTree = new Dictionary<int, MenuSectionTree>(); foreach (BXIBlockSection section in sectionsList) { BXParamsBag<object> replaceItems = new BXParamsBag<object>(); replaceItems["SECTION_ID"] = section.Id; replaceItems["SECTION_CODE"] = section.Code ?? String.Empty; replaceItems["SectionId"] = replaceItems["SECTION_ID"]; replaceItems["SectionCode"] = replaceItems["SECTION_CODE"]; sectionTree[section.Id] = new MenuSectionTree(); string url = MakeMenuUri(executionVirtualPath, replaceItems); sectionTree[section.Id].url = url; sectionTree[section.Id].sectionId = section.SectionId; //Если предыдущий раздел не имеет дочерних разделов, то устанавливаем у него parentLevelUrl if (previousSectionId > 0 && section.DepthLevel <= previousDepthLevel) sectionTree[previousSectionId].parentLevelUrl = sectionTree[sectionTree[previousSectionId].sectionId].url; previousDepthLevel = section.DepthLevel; previousSectionId = section.Id; BXPublicMenuItem menuItem = new BXPublicMenuItem(); menuItem.Title = section.Name; menuItem.Links.Add(url); menuItem.Sort = section.LeftMargin; menuItem.ConditionType = ConditionType.Group; menuItem.Condition = menuItemPermisson; if (!sectionTree.ContainsKey(section.SectionId)) { sectionTree[section.SectionId] = new MenuSectionTree(); sectionTree[section.SectionId].menuItems = new List<BXPublicMenuItem>(); if (section.SectionId < 1) sectionTree[section.SectionId].url = EnableSef ? BXPath.ToVirtualRelativePath(BXPath.TrimStart(SefFolder)) : BXSiteRemapUtility.UnmapVirtualPath(executionVirtualPath); } if (sectionTree[section.SectionId].menuItems == null) sectionTree[section.SectionId].menuItems = new List<BXPublicMenuItem>(); sectionTree[section.SectionId].menuItems.Add(menuItem); } //Последний элемент не может иметь дочерних элементов, поэтому указываем parentLevelUrl if (sectionTree.ContainsKey(previousSectionId) && sectionTree.ContainsKey(sectionTree[previousSectionId].sectionId)) sectionTree[previousSectionId].parentLevelUrl = sectionTree[sectionTree[previousSectionId].sectionId].url; foreach (KeyValuePair<int, MenuSectionTree> sectionItem in sectionTree) { if (!menuTree.ContainsKey(sectionItem.Value.url)) { menuTree.Add( sectionItem.Value.url, new BXPublicMenu.BXLoadMenuCommandParameter(sectionItem.Value.menuItems, true, sectionItem.Value.parentLevelUrl) ); } } } if (menuTree.Count > 0) cmd.AddCommandResult("bitrix:catalogue@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, menuTree)); else if (menuList != null || parentLevelUri != null) { BXPublicMenu.BXLoadMenuCommandParameter menuResult = new BXPublicMenu.BXLoadMenuCommandParameter(menuList, true, parentLevelUri); cmd.AddCommandResult("bitrix:catalogue@" + executionVirtualPath, new BXCommandResult(BXCommandResultType.Ok, menuResult)); } } }