HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/RMourik/bassol.nl/wwwroot/App_Code/CMSModules/Sites/DomainAliasEditExtender.cs
using System;
using System.Data;

using CMS;
using CMS.Base;
using CMS.ExtendedControls;
using CMS.FormControls;
using CMS.Helpers;
using CMS.SiteProvider;

[assembly: RegisterCustomClass("DomainAliasEditExtender", typeof(DomainAliasEditExtender))]

/// <summary>
/// Domain alias edit extender.
/// </summary>
public class DomainAliasEditExtender : ControlExtender<UIForm>
{
    #region "Variables"

    private SiteInfo siteInfo = null;
    private SiteDomainAliasInfo domainInfo = null;
    private bool runAfterSave;

    #endregion


    #region "Methods"

    /// <summary>
    /// Init event of the UI form.
    /// </summary>
    public override void OnInit()
    {
        Control.OnAfterDataLoad += Control_OnAfterDataLoad;
        Control.OnBeforeSave += Control_OnBeforeSave;
        Control.OnAfterSave += Control_OnAfterSave;
        Control.OnAfterValidate += Control_OnAfterValidate;

        ComponentEvents.RequestEvents.RegisterForComponentEvent("DomainAliasEditCheckCollision", "StopSite", StopSiteAndSave);
    }


    /// <summary>
    /// AfterDataLoad event handler of UIForm.
    /// </summary>
    /// <param name="sender">Sender object</param>
    /// <param name="e">Event argument</param>
    private void Control_OnAfterDataLoad(object sender, EventArgs e)
    {
        domainInfo = Control.EditedObject as SiteDomainAliasInfo;
        siteInfo = Control.UIContext.EditedObjectParent as SiteInfo;

        // Set SiteID of SiteCultureSelector in order to offer only cultures assigned to the edited site.
        FormEngineUserControl visitorCultureControl = Control.FieldControls["SiteDefaultVisitorCulture"];
        if (visitorCultureControl != null)
        {
            visitorCultureControl.SetValue("SiteID", siteInfo.SiteID);
        }
    }


    /// <summary>
    /// Handles OnAfterValidate event of the UI form.
    /// </summary>
    /// <param name="sender">Sender object</param>
    /// <param name="e">Event argument</param>
    protected void Control_OnAfterValidate(object sender, EventArgs e)
    {
        if (siteInfo != null)
        {
            // Check for domain name collision
            if (siteInfo.Status == SiteStatusEnum.Running)
            {
                string domainName = ValidationHelper.GetString(Control.GetFieldValue("SiteDomainAliasName"), String.Empty);
                SiteInfo runningSite = SiteInfoProvider.GetRunningSiteInfo(domainName, null);
                if ((runningSite != null) && (siteInfo.SiteID != runningSite.SiteID))
                {
                    Control.StopProcessing = true;

                    // Hide error message because user gets informed via confirmation
                    Control.MessagesPlaceHolder.Visible = false;

                    string postBackRef = ControlsHelper.GetPostBackEventReference(Control.ObjectManager.HeaderActions, "StopSite;");
                    string script = "if (confirm('" + ScriptHelper.GetString(ResHelper.GetStringFormat("sitedomain.proceedwithcollision", runningSite.DisplayName), false) + "')) { " + postBackRef + "; }";
                    ScriptHelper.RegisterStartupScript(Control.Page, typeof(string), "DomainCollisionMessage", ScriptHelper.GetScript(script));
                }
            }

            // Remember the state of the site
            runAfterSave = (siteInfo.Status == SiteStatusEnum.Running);
        }
    }


    /// <summary>
    /// Handle OnAfterSave event of the UI form.
    /// </summary>
    /// <param name="sender">Sender object</param>
    /// <param name="e">Event argument</param>
    protected void Control_OnAfterSave(object sender, EventArgs e)
    {
        // Run site again if it was previously running
        if ((siteInfo != null) && runAfterSave)
        {
            string domainName = ValidationHelper.GetString(Control.GetFieldValue("SiteDomainAliasName"), String.Empty);
            DataSet ds = SiteInfoProvider.CheckDomainNameForCollision(domainName, siteInfo.SiteID);
            if (!DataHelper.DataSourceIsEmpty(ds))
            {
                SiteInfo runningSite = SiteInfoProvider.GetSiteInfo(ValidationHelper.GetInteger(ds.Tables[0].Rows[0]["SiteID"], 0));
                if (runningSite != null)
                {
                    string collisionSite = runningSite.DisplayName;
                    string collisionDomain = ValidationHelper.GetString(ds.Tables[0].Rows[0]["SiteDomainAliasName"], "");
                    Control.ShowError(String.Format(ResHelper.GetString("SiteDomain.RunError"), collisionSite, collisionDomain, siteInfo.DisplayName));
                }
            }
            else
            {
                // Try to re-run the site
                try
                {
                    SiteInfoProvider.RunSite(siteInfo.SiteName);
                }
                catch (RunningSiteException ex)
                {
                    Control.ShowError(ex.Message);
                }
            }
        }
    }


    /// <summary>
    /// Handle OnBeforeSave event of the UI form.
    /// </summary>
    /// <param name="sender">Sender object</param>
    /// <param name="e">Event argument</param>
    protected void Control_OnBeforeSave(object sender, EventArgs e)
    {
        if (siteInfo == null)
        {
            return;
        }

        if (!Control.IsInsertMode)
        {
            // Stop the site before saving the domain alias
            if (siteInfo.Status == SiteStatusEnum.Running)
            {
                SiteInfoProvider.StopSite(siteInfo.SiteName);
                siteInfo.Status = SiteStatusEnum.Stopped;
                runAfterSave = true;
            }
        }

        // Remove protocol from the domain alias
        string newDomainName = ValidationHelper.GetString(Control.Data["SiteDomainAliasName"], String.Empty);
        newDomainName = URLHelper.RemoveProtocol(newDomainName);
        Control.Data["SiteDomainAliasName"] = newDomainName.Trim();

        // Ensure uniqueness of the domain name
        if (Control.IsInsertMode)
        {
            // Check duplicity
            if (SiteDomainAliasInfoProvider.DomainAliasExists(newDomainName, siteInfo.SiteID))
            {
                Control.StopProcessing = true;
                Control.ShowError(ResHelper.GetString("Site_Edit.AliasExists"));
            }
        }
        else
        {
            // Check duplicity
            SiteDomainAliasInfo existing = SiteDomainAliasInfoProvider.GetSiteDomainAliasInfo(newDomainName, siteInfo.SiteID);
            if ((existing != null) && (existing.SiteDomainAliasID != domainInfo.SiteDomainAliasID))
            {
                Control.StopProcessing = true;
                Control.ShowError(ResHelper.GetString("Site_Edit.AliasExists"));
            }
        }
    }


    /// <summary>
    /// Handles the event that occurs when user confirms that the site domain alias object should be saved despite another site is using the same domain name.
    /// </summary>
    /// <param name="sender">Object sender</param>
    /// <param name="e">Event arguments</param>
    private void StopSiteAndSave(object sender, EventArgs e)
    {
        if (siteInfo != null)
        {
            // Stop the site in order to finish saving the domain alias
            siteInfo.Status = SiteStatusEnum.Stopped;
            siteInfo.Update();
            Control.SaveData(null);
        }
    }

    #endregion
}