Пример #1
0
	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)));
	}
Пример #2
0
	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;
	}
Пример #3
0
	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);
	}
Пример #4
0
	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;
	}
Пример #5
0
	public void MarkDeleted(BXPublicMenuItem item)
	{
		if (deleted == null)
			deleted = new List<BXPublicMenuItem>();
		deleted.Add(item);
	}
Пример #6
0
	public bool IsDeleted(BXPublicMenuItem item)
	{
		if (deleted == null)
			return false;
		return deleted.Contains(item);
	}
Пример #7
0
    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);
        }
    }
Пример #8
0
	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);
		}
	}
Пример #9
0
    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;
    }
Пример #10
0
    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));
            }


        }
    }
Пример #11
0
        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));
                }
            }
        }
Пример #12
0
	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);
		}
	}
Пример #13
0
    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();
    }
Пример #14
0
		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;
		}
Пример #15
0
		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));
				}
			}
		}