コード例 #1
0
    protected void Behaviour_Yes(object sender, EventArgs e)
    {
        try
        {
            BXUser.DemandOperations(BXRoleOperation.Operations.FileManage);

            if (string.IsNullOrEmpty(mPath))
                throw new InvalidOperationException("Could not find path!");

            string phPath = BXPath.ToPhysicalPath(mPath);
            FileInfo fi = new FileInfo(phPath);
            if (!fi.Exists)
                Close(GetMessage("PATH_IS_NOT_EXISTS"), BXDialogGoodbyeWindow.LayoutType.Error, -1);

            string ext = fi.Extension;

            if (string.Compare(ext, ".aspx", StringComparison.OrdinalIgnoreCase) != 0)
                Close(GetMessage("FILE_HAS_INVALID_EXTENSION"), BXDialogGoodbyeWindow.LayoutType.Error, -1);

            if (string.IsNullOrEmpty(mDirectoryPath))
                throw new InvalidOperationException("Could not find directory path!");

            //если удаляем страницу по умолчанию, то текущим каталогом сразу становиться родительский каталог
            //if(string.Equals(mFileName, BXConfigurationUtility.Constants.DefaultPage, StringComparison.InvariantCultureIgnoreCase))
            //    mDirectoryPath = VirtualPathUtility.GetDirectory(mDirectoryPath);
            //mDirectoryPath = VirtualPathUtility.AppendTrailingSlash(mDirectoryPath);

            //пытаемся перенаправить пользователя на страницу по умолчанию текущего каталога, если её не существует поднимаемся выше по дереву каталогов
            //если удаляем страницу по умолчанию, то текущим каталогом сразу становиться родительский каталог

            string redirectionDirPath = 
				string.Equals(mFileName, BXConfigurationUtility.Constants.DefaultPage, StringComparison.InvariantCultureIgnoreCase) 
				? VirtualPathUtility.GetDirectory(mDirectoryPath) : 
				mDirectoryPath;

            redirectionDirPath = VirtualPathUtility.AppendTrailingSlash(redirectionDirPath);
            string redirectionPath = VirtualPathUtility.Combine(redirectionDirPath, BXConfigurationUtility.Constants.DefaultPage);
            while (!BXSecureIO.FileExists(redirectionPath) && !string.Equals(redirectionDirPath, "~/", StringComparison.Ordinal)) 
            {
                redirectionDirPath = VirtualPathUtility.GetDirectory(redirectionDirPath);
                redirectionPath = VirtualPathUtility.Combine(redirectionDirPath, BXConfigurationUtility.Constants.DefaultPage);
            }

            StringBuilder sb = new StringBuilder(BXSite.GetUrlForPath(redirectionDirPath, null));
            string showModeParamValue = BXConfigurationUtility.GetShowModeParamValue(BXConfigurationUtility.GetShowMode(sb.ToString()));
            sb.Append('?');
            sb.Append(HttpUtility.UrlEncode(BXConfigurationUtility.Constants.ShowModeParamName));
            sb.Append('=');
            sb.Append(HttpUtility.UrlEncode(showModeParamValue));

			BXUndoPageDeletionOperation undoOperation = new BXUndoPageDeletionOperation();
			undoOperation.FileVirtualPath = mPath;
			undoOperation.FileEncodingName = BXConfigurationUtility.DefaultEncoding.WebName;
			undoOperation.FileContent = BXSecureIO.FileReadAllText(mPath, BXConfigurationUtility.DefaultEncoding);
			BXSite site = BXSite.GetCurrentSite(mPath, Bitrix.Services.BXSefUrlManager.CurrentUrl.Host);
			undoOperation.SiteId = site != null ? site.Id : BXSite.DefaultSite.Id;

            BXSecureIO.FileDelete(phPath);

            if (deleteMenuItemChkBx.Checked)
            {
                if (mPathList != null && mPathList.Count > 0)
                    mPathList.Clear();

				string unmapped = Bitrix.Services.BXSiteRemapUtility.UnmapVirtualPath(mPath, site);
			    RemovePathFromMenus(site.DirectoryVirtualPath, site.UrlVirtualPath, site, undoOperation);
            }

			BXUndoInfo undo = new BXUndoInfo();
			undo.Operation = undoOperation;
			undo.Save();

			BXDialogGoodbyeWindow goodbye = new BXDialogGoodbyeWindow(string.Format(
				GetMessageRaw("OPERATION_IS_COMPLETED_SUCCESSFULLY_UNDO"), 
				string.Concat(undo.GetClientScript(), " return false;"), 
				"#"), -1, BXDialogGoodbyeWindow.LayoutType.Success);
			BXDialogGoodbyeWindow.SetCurrent(goodbye);

            Redirect(sb.ToString(), string.Empty);
        }
        catch (System.Threading.ThreadAbortException /*exception*/)
        {
            //...игнорируем, вызвано Close();
        }
        catch (Exception exception)
        {
            ShowError(exception.Message);
        }
    }
コード例 #2
0
    //protected bool IsPathPresentInMenu
    //{
    //    get 
    //    {
    //        if (string.IsNullOrEmpty(mPath))
    //            throw new InvalidOperationException("Could not find path!");

    //        List<BXMenu> resultLst = new List<BXMenu>();
    //        BXMenuManager.MenuPair[] menuIdArr = BXMenuManager.GetMenuTypes(BXSite.Current.Id);
    //        int menuCount = menuIdArr != null ? menuIdArr.Length : 0;
    //        for (int i = 0; i < menuCount; i++)
    //        {
    //            BXMenuManager.MenuPair menuId = menuIdArr[i];
    //            BXMenu menu = BXMenuManager.Load(mPath, menuId.Id, 1);
    //            int menuItemCount = menu != null ? menu.Count : 0;
    //            for (int j = 0; j < menuItemCount; j++)
    //            {
    //                BXMenuItem menuItem = menu[j];

    //                string menuItemPath = menuItem.Link;

    //                menuItemPath = BXPath.ToVirtualRelativePath(menuItem.Link);
    //                if (string.Compare(menuItemPath, mPath, StringComparison.OrdinalIgnoreCase) == 0 ||
    //                    (IsDefaultFileName && 
    //                    string.Compare(menuItemPath, mDirectoryPath, StringComparison.OrdinalIgnoreCase) == 0)
    //                    ) 
    //                    return true;
    //            }
    //        }
    //        return false;
    //    }
    //}

    //private List<string> handledMenuPathList = null;

    protected void RemovePathFromMenus(string virtualDirectoryPath, string virtualUrlPath, BXSite site, BXUndoPageDeletionOperation undoOperation)
	{
		if (string.IsNullOrEmpty(this.mPath))
			throw new ArgumentException("Is not specified!", "mPath");
		//---
		if (string.IsNullOrEmpty(this.mDirectoryPath))
			throw new ArgumentException("Is not specified!", "mDirectoryPath");
		//---

		if (string.IsNullOrEmpty(virtualDirectoryPath))
			throw new ArgumentException("Is not specified!", "virtualDirectoryPath");
		//---
		

//		BXSite site = Bitrix.Services.BXSiteRemapUtility.UnmapVirtualPath(virtualDirectoryPath, out virtualDirectoryPath);// BXSite.GetCurrentSite(virtualDirectoryPath, Request.Url.Host);
		if (site == null)
			throw new InvalidOperationException(string.Format("Could not find site for path '{0}'!", virtualDirectoryPath));
		//---

		var path = Bitrix.Services.BXSiteRemapUtility.UnmapVirtualPath(this.mPath, site);
		var directoryPath = Bitrix.Services.BXSiteRemapUtility.UnmapVirtualPath(this.mDirectoryPath, site);


		Dictionary<string, string> menuTypeDic = BXPublicMenu.GetMenuTypes(site.Id);
		foreach (string key in menuTypeDic.Keys)
		{
			//BXMenuManager.MenuPair menuId = menuIdArr[i];
			string menuId = key;
			BXPublicMenuItemCollection menuItemCol = null;
			try
			{
				menuItemCol = BXPublicMenu.Menu.GetMenuByUri(menuId, virtualUrlPath);
			}
			catch (Exception /*exception*/)
			{
				menuItemCol = null;
			}

			if (menuItemCol == null || menuItemCol.Count == 0)
				continue;

			if (!string.IsNullOrEmpty(menuItemCol.MenuFilePath) &&
				mPathList != null &&
			   mPathList.FindIndex(
				   delegate(string curPath)
				   { return string.Compare(menuItemCol.MenuFilePath, curPath, StringComparison.OrdinalIgnoreCase) == 0; }
			   ) >= 0)
				continue;

			bool menuChanged = false;
			int j = 0;

			while (j < menuItemCol.Count)
			{
				BXPublicMenuItem menuItem = menuItemCol[j];
				string menuItemPath = null;

				if (!string.IsNullOrEmpty(menuItem.Link))
					try
					{
						int whatInd = menuItem.Link.IndexOf('?');
						if (whatInd < 0)
							menuItemPath = BXPath.ToVirtualRelativePath(menuItem.Link);
						else
							menuItemPath = BXPath.ToVirtualRelativePath(menuItem.Link.Substring(0, whatInd));
					}
					catch (Exception /*exception*/)
					{
						menuItemPath = null;
					}

				bool aboutDelete = false;
				if (!string.IsNullOrEmpty(menuItemPath))
				{
					if (string.Equals(mFileName, BXConfigurationUtility.Constants.DefaultPage, StringComparison.OrdinalIgnoreCase))
						aboutDelete = string.Equals(VirtualPathUtility.AppendTrailingSlash(menuItemPath), directoryPath, StringComparison.OrdinalIgnoreCase);

					if (!aboutDelete)
						aboutDelete = string.Equals(VirtualPathUtility.RemoveTrailingSlash(menuItemPath), path, StringComparison.OrdinalIgnoreCase);
				}

				if (!aboutDelete)
				{
					j++;
					continue;
				}

				if(undoOperation != null)
				{
					BXUndoPageDeletionOperation.MenuItemInfo menuItemInfo = null;
					foreach(BXUndoPageDeletionOperation.MenuItemInfo curMenuItemInfo in undoOperation.MenuItemInfoList)
					{
						if(!string.Equals(curMenuItemInfo.MenuTypeId, menuId, StringComparison.Ordinal))
							continue;

						menuItemInfo = curMenuItemInfo;
						break;
					}

					if(menuItemInfo == null)
					{
						menuItemInfo = new BXUndoPageDeletionOperation.MenuItemInfo();
						undoOperation.MenuItemInfoList.Add(menuItemInfo);
					}

					menuItemInfo.MenuTypeId = menuId;
					menuItemInfo.MenuItemName = menuItem.Title;
					menuItemInfo.MenuItemIndex = j;
					menuItemInfo.Link = menuItem.Link;
				}

				menuItemCol.RemoveAt(j);

				if (!menuChanged)
					menuChanged = true;
			}

			if (menuChanged)
			{
				BXPublicMenu.Menu.Save(virtualDirectoryPath, menuId, menuItemCol);				
			}
			if (mPathList == null)
				mPathList = new List<string>();

			if (!string.IsNullOrEmpty(menuItemCol.MenuFilePath) &&
				mPathList.FindIndex(
					delegate(string curPath)
					{ return string.Compare(menuItemCol.MenuFilePath, curPath, StringComparison.OrdinalIgnoreCase) == 0; }
				) < 0)
				mPathList.Add(menuItemCol.MenuFilePath);
		}

		foreach (var d in new DirectoryInfo(BXPath.ToPhysicalPath(virtualDirectoryPath)).GetDirectories())
		{
			///HACK: Ignoring service derectories
			string childDirectoryVirtualPath = string.Concat(virtualDirectoryPath, d.Name, "/");
			if (BXPath.StartsWithPath(childDirectoryVirtualPath, "~/app_browsers/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/app_data/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/app_themes/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/bin/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/bitrix/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/upload/")
			)
				continue;

			RemovePathFromMenus(childDirectoryVirtualPath, string.Concat(virtualUrlPath, d.Name, "/"), site, undoOperation);
		}
	}