protected string Serialize(BXPublicMenuItem m) { BXParamsBag<object> item = new BXParamsBag<object>(); item["Title"] = m.Title; item["Sort"] = m.Sort; item["ConditionType"] = (int)m.ConditionType; item["Condition"] = m.Condition; item["ParamName"] = m.ParamName; item["ParamValue"] = m.ParamValue; item["Links"] = m.Links; return Convert.ToBase64String(Encoding.UTF8.GetBytes(BXSerializer.Serialize(item))); }
protected BXPublicMenuItem Deserialize(string value) { BXPublicMenuItem m = new BXPublicMenuItem(); if (string.IsNullOrEmpty(value)) return m; BXParamsBag<object> item = BXSerializer.Deserialize(Encoding.UTF8.GetString(Convert.FromBase64String(value))) as BXParamsBag<object>; if (item == null) return m; m.Title = item.Get<string>("Title"); m.Sort = item.Get<int>("Sort"); //m.Link = item.Get<string>("Link"); m.ConditionType = (ConditionType)item.Get<int>("ConditionType"); m.Condition = item.Get<string>("Condition"); m.ParamName = item.Get<string>("ParamName"); m.ParamValue = item.Get<string>("ParamValue"); m.Links.AddRange(item.Get<IEnumerable<string>>("Links")); return m; }
private void AddToMenu(string menuTypeId, MenuTypeInfo info, string pageNameExtensionless) { BXPublicMenuItemCollection menuItemCol = null; if ((info.SourcePath != null && Request.Form[string.Concat(UniqueID, IdSeparator, "cbCreateInSection")] != "Y")) menuItemCol = info.Items; else if (info.SectionPath == null) return; bool isNewMenu = false; if (menuItemCol == null) { menuItemCol = new BXPublicMenuItemCollection(); isNewMenu = true; } int menuItemIndex = ddlMenuItems.SelectedIndex; int menuItemCount = menuItemCol.Count; if (menuItemIndex < 0 || menuItemIndex > menuItemCount) menuItemIndex = menuItemCount; BXPublicMenuItem menuItem = new BXPublicMenuItem(); menuItem.Link = Bitrix.Services.BXSiteRemapUtility.UnmapVirtualPath(_clientVirtualPath); string title = !string.IsNullOrEmpty(tbxMenuName.Text) ? tbxMenuName.Text : pageNameExtensionless; menuItem.Title = HttpUtility.HtmlEncode(title); menuItemCol.Insert(menuItemIndex, menuItem); menuItemCount++; for (int i = 0; i < menuItemCount; i++) menuItemCol[i].Sort = (i + 1) * 10; string menuDirPath = BXPath.GetDirectory(!isNewMenu ? info.SourcePath : info.SectionPath); BXPublicMenu.Menu.Save(menuDirPath, menuTypeId, menuItemCol); }
private List<BXPublicMenuItem> ExtractMenuItemsFromCollection(string executionVirtualPath, List<BXPublicMenuItem> resultList, BXIBlockSectionCollection coll) { resultList = null; if (coll != null && coll.Count > 0) { resultList = new List<BXPublicMenuItem>(); foreach (BXIBlockSection s in coll) { BXPublicMenuItem i1 = new BXPublicMenuItem(); i1.Title = s.Name; BXParamsBag<object> p = new BXParamsBag<object>(); p["SECTION_ID"] = s.Id; p["SECTION_CODE"] = s.Code ?? string.Empty; i1.Links.Add(MakeMenuUri(executionVirtualPath, p)); i1.Sort = s.Sort; resultList.Add(i1); } } return resultList; }
public void MarkDeleted(BXPublicMenuItem item) { if (deleted == null) deleted = new List<BXPublicMenuItem>(); deleted.Add(item); }
public bool IsDeleted(BXPublicMenuItem item) { if (deleted == null) return false; return deleted.Contains(item); }
private void SaveMenu(bool removeDeleted) { int sort = 0; Menu.Clear(); foreach (Control rep in repItems.Controls) { TextBox tbTitle = rep.FindControl("tbTitle") as TextBox; TextBox tbLink = rep.FindControl("tbLink") as TextBox; TextBox tbParamName = rep.FindControl("tbParamName") as TextBox; TextBox tbParamValue = rep.FindControl("tbParamValue") as TextBox; TextBox tbSort = rep.FindControl("tbSort") as TextBox; CheckBox cbDelete = rep.FindControl("cbDelete") as CheckBox; TextBox tbExtra = rep.FindControl("tbExtra") as TextBox; DropDownList ddlConditiontype = rep.FindControl("ConditionType") as DropDownList; BXPublicMenuItem item = new BXPublicMenuItem(); item.ConditionType = (ConditionType)Enum.Parse(typeof(ConditionType), ddlConditiontype.SelectedValue); switch (item.ConditionType) { case ConditionType.None: item.Condition = string.Empty; break; case ConditionType.FileOrFolder: TextBox tbFileOrFolder = rep.FindControl("tbFileOrFolder") as TextBox; if (string.IsNullOrEmpty(tbFileOrFolder.Text)) item.ConditionType = ConditionType.None; else item.Condition = tbFileOrFolder.Text; break; case ConditionType.Group: IRoleList rlGroup = rep.FindControl("rlGroup") as IRoleList; if (rlGroup.SelectedRoles.Length == 0) item.ConditionType = ConditionType.None; else item.Condition = BXStringUtility.ListToString(rlGroup.SelectedRoles); break; case ConditionType.Time: ITimeInterval tiPeriod = rep.FindControl("tiPeriod") as ITimeInterval; if (tiPeriod.StartDate.Equals(DateTime.MinValue) && tiPeriod.EndDate.Equals(DateTime.MaxValue)) item.ConditionType = ConditionType.None; else item.Condition = BXStringUtility.TimeIntervalToString(tiPeriod.StartDate, tiPeriod.EndDate); break; case ConditionType.Url: IUrlParameter upParams = rep.FindControl("upParams") as IUrlParameter; if (string.IsNullOrEmpty(upParams.ParameterName)) item.ConditionType = ConditionType.None; else item.Condition = BXStringUtility.ParamToString(upParams.ParameterName, upParams.ParameterValue); break; } //Sort if (!int.TryParse(tbSort.Text, out sort)) sort += 10; item.Sort = sort; if (cbDelete.Checked) MarkDeleted(item); item.Title = tbTitle.Text; //Title item.Link = tbLink.Text; //Link //ExtraLinks foreach (string link in tbExtra.Text.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) { item.Links.Add(link); } //Param if (!string.IsNullOrEmpty(tbParamName.Text) && !string.IsNullOrEmpty(tbParamValue.Text)) { item.ParamName = tbParamName.Text.Trim(); item.ParamValue = tbParamValue.Text.Trim(); } if (!removeDeleted || !IsDeleted(item) && !string.IsNullOrEmpty(item.Title)) Menu.Add(item); } }
private void SaveMenu() { if (!AddMenu.Checked) return; try { string menuType = MenuType.SelectedValue; string menuPath = BXPath.Combine(this.saveDir, menuType + ".menu"); BXSecureIO.DemandView(menuPath); BXSecureIO.DemandWrite(menuPath); BXPublicMenuItemCollection menu = BXPublicMenu.Menu.Load(this.saveDir, menuType); if (menuControls[menuType].New.SelectedValue != "exists") //new { int j = menuControls[menuType].Before.SelectedIndex; if (j < 0 || j > menu.Count) j = menu.Count; BXPublicMenuItem item = new BXPublicMenuItem(); item.Title = menuControls[menuType].Name.Text; item.Link = BXSiteRemapUtility.UnmapVirtualPath(BXPath.ToVirtualRelativePath(this.savePath)); menu.Insert(j, item); for (int k = 0; k < menu.Count; k++) menu[k].Sort = (k + 1) * 10; BXPublicMenu.Menu.Save(this.saveDir, menuType, menu); } else { int j = menuControls[menuType].AddTo.SelectedIndex; if (j < 0 || j >= menu.Count) j = menu.Count - 1; if (j >= 0) { BXPublicMenuItem item = menu[j]; item.Links.Add( BXSiteRemapUtility.UnmapVirtualPath(BXPath.ToVirtualRelativePath(savePath))); for (int k = 0; k < menu.Count; k++) menu[k].Sort = (k + 1) * 10; BXPublicMenu.Menu.Save(this.saveDir, menuType, menu); } } } catch (Exception ex) { throw new PublicException(GetMessageRaw("Message.UnableToCreateMenu"), ex); } }
private List<BXPublicMenuItem> ExtractMenuItemsFromCollection(BXIBlockSectionCollection sectionsList, string executionVirtualPath) { if (sectionsList == null || sectionsList.Count < 1) return null; List<BXPublicMenuItem> menuList = new List<BXPublicMenuItem>(); foreach (BXIBlockSection section in sectionsList) { 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; } menuList.Add(menuItem); } return menuList; }
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) { 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)); } } }
void DoCreateMenuItem(string dirPath) { if (string.IsNullOrEmpty(MenuItemName.Text)) throw new PublicException(GetMessageRaw("Message.EmptyMenuItemName")); if (string.IsNullOrEmpty(MenuType.SelectedValue) || (MenuType.SelectedValue.IndexOfAny(Path.GetInvalidFileNameChars()) != -1)) throw new PublicException(GetMessageRaw("Message.IllegalMenuType")); try { BXUser.DemandOperations(BXRoleOperation.Operations.FileManage); bool isNewMenu = false; BXPublicMenuItemCollection menuItemCol = BXPublicMenu.Menu.GetMenuByUri(MenuType.SelectedValue, dirPath); if (menuItemCol == null) { menuItemCol = new BXPublicMenuItemCollection(); isNewMenu = true; } BXPublicMenuItem menuItem = new BXPublicMenuItem(); menuItem.Link = BXSiteRemapUtility.UnmapVirtualPath(VirtualPathUtility.AppendTrailingSlash(BXPath.TrimEnd(dirPath))); menuItem.Title = MenuItemName.Text; menuItemCol.Add(menuItem); int menuItemCount = menuItemCol.Count; for (int i = 0; i < menuItemCount; i++) menuItemCol[i].Sort = (i + 1) * 10; string menuDirPath = dirPath; if (!isNewMenu && !string.IsNullOrEmpty(menuItemCol.MenuFilePath)) menuDirPath = BXPath.GetDirectory(menuItemCol.MenuFilePath); BXPublicMenu.Menu.Save(menuDirPath, MenuType.SelectedValue, menuItemCol); } catch(Exception ex) { throw new PublicException(GetMessageRaw("Message.UnableToCreateMenu"), ex); } }
protected void mainTabControl_Command(object sender, BXTabControlCommandEventArgs e) { if (string.IsNullOrEmpty(Path)) return; BXPublicMenuItemCollection menu = new BXPublicMenuItemCollection(); switch (e.CommandName.ToLower()) { case "apply": case "save": for (int i = 1; i < tblItems.Rows.Count; i++) { TextBox title = tblItems.Rows[i].Cells[0].Controls[0] as TextBox; TextBox link = tblItems.Rows[i].Cells[1].Controls[0] as TextBox; TextBox sort = tblItems.Rows[i].Cells[2].Controls[0] as TextBox; CheckBox delete = tblItems.Rows[i].Cells[3].Controls[0] as CheckBox; if (!delete.Checked && !string.IsNullOrEmpty(title.Text.Trim())) { BXPublicMenuItem item = new BXPublicMenuItem(); item.Link = link.Text; item.Title = title.Text; int weight; if (int.TryParse(sort.Text, out weight)) item.Sort = weight; else item.Sort = 10; menu.Add(item); } } BXPublicMenu.Menu.Save(CurDir, MenuType, menu); if (e.CommandName.ToLower() == "apply") Response.Redirect(Request.RawUrl); break; } GoBack(); }
private List<BXPublicMenuItem> ExtractMenuItemsFromCollection(BXIBlockSectionCollection sectionsList, string executionVirtualPath) { if (sectionsList == null || sectionsList.Count < 1) return null; List<BXPublicMenuItem> menuList = new List<BXPublicMenuItem>(); foreach (BXIBlockSection section in sectionsList) { BXPublicMenuItem menuItem = new BXPublicMenuItem(); menuItem.Title = section.Name; 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"]; menuItem.Links.Add(MakeMenuUri(executionVirtualPath, replaceItems)); menuItem.Sort = section.LeftMargin; menuItem.ConditionType = ConditionType.Group; menuItem.Condition = menuItemPermisson; menuList.Add(menuItem); } return menuList; }
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)); } } }