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/TDijk1/erp-apps.eu/wwwroot/App_Code/CMSModules/Sites/SiteEditPageExtender.cs
using System;
using System.Data;
using System.Linq;

using CMS;
using CMS.Base;
using CMS.DataEngine;
using CMS.ExtendedControls;
using CMS.ExtendedControls.ActionsConfig;
using CMS.FormControls;
using CMS.Helpers;
using CMS.Membership;
using CMS.Search;
using CMS.SiteProvider;
using CMS.UIControls;

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

/// <summary>
/// Site edit page extender.
/// </summary>
public class SiteEditPageExtender : ControlExtender<UIForm>
{
    #region "Variables"

    private SiteInfo siteInfo = null;
    private bool runSite;
    private string formerCodeName = null;

    #endregion


    #region "Methods"

    /// <summary>
    /// Extender initialization.
    /// </summary>
    public override void OnInit()
    {
        Control.OnAfterDataLoad += Control_OnAfterDataLoad;
        Control.OnAfterSave += Control_OnAfterSave;
        Control.OnBeforeSave += Control_OnBeforeSave;
        Control.Page.PreRenderComplete += Page_PreRenderComplete;
        Control.OnAfterValidate += Control_OnAfterValidate;
        ComponentEvents.RequestEvents.RegisterForComponentEvent("SiteEditCheckCollision", "StopSite", StopSiteAndSave);
        ComponentEvents.RequestEvents.RegisterForComponentEvent("SiteEditRebuildIndex", "RebuildSiteIndex", RebuildSiteIndex);
    }


    /// <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)
    {
        // Store edited site object in local variable
        siteInfo = Control.EditedObject 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);
        }

        // Set "(none)" special item value for Site default stylesheet field
        EditingFormControl efc = Control.FieldEditingControls["SiteDefaultStylesheetID"];
        if (efc != null)
        {
            UniSelector uniSelector = ControlsHelper.GetChildControl(efc, typeof(UniSelector)) as UniSelector;
            if (uniSelector != null)
            {
                uniSelector.NoneRecordValue = "-1";
            }
        }
    }


    /// <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)
    {
        // Check for domain name collision
        if (siteInfo.Status == SiteStatusEnum.Running)
        {
            string domainName = ValidationHelper.GetString(Control.GetFieldValue("SiteDomainName"), String.Empty);
            DataSet ds = SiteInfoProvider.CheckDomainNameForCollision(domainName, siteInfo.SiteID);
            if (!DataHelper.DataSourceIsEmpty(ds))
            {
                int collisionSiteID = ValidationHelper.GetInteger(ds.Tables[0].Rows[0]["SiteID"], 0);
                SiteInfo collisionSite = SiteInfoProvider.GetSiteInfo(collisionSiteID);

                if (collisionSite != null)
                { 
                    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", collisionSite.DisplayName), false) + "')) { " + postBackRef + "; } ";
                    ScriptHelper.RegisterStartupScript(Control.Page, typeof(string), "DomainCollisionMessage", ScriptHelper.GetScript(script));
                }
            }
        }

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


    /// <summary>
    /// Handle PreRenderComplete event of the page.
    /// </summary>
    /// <param name="sender">Sender object</param>
    /// <param name="e">Event argument</param>
    protected void Page_PreRenderComplete(object sender, EventArgs e)
    {
        if ((siteInfo != null) && !RequestHelper.IsPostBack())
        {
            // Check version limitations
            if (!CultureSiteInfoProvider.LicenseVersionCheck(siteInfo.DomainName, FeatureEnum.Multilingual, ObjectActionEnum.Edit))
            {
                Control.ShowError(ResHelper.GetString("licenselimitation.siteculturesexceeded"));
                
                // Disable culture selector
                FormEngineUserControl cultureSelector = Control.FieldControls["SiteDefaultVisitorCulture"];
                if (cultureSelector != null)
                {
                    cultureSelector.Enabled = false;
                }

                // Disable Save button
                HeaderActions actions = Control.ObjectManager.HeaderActions;
                SaveAction sa = actions.ActionsList.Where<HeaderAction>(a => (a is SaveAction)).First() as SaveAction;
                if (sa != null)
                {
                    sa.Enabled = false;
                    sa.BaseButton.Visible = true;
                    actions.ReloadData();
                    Control.SubmitButton.Visible = false;
                }
            }
        }
    }


    /// <summary>
    /// Handles 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)
    {
        string newSiteCodeName = ValidationHelper.GetString(Control.GetFieldValue("SiteName"), String.Empty);
        SiteInfo existingSiteInfo = SiteInfoProvider.GetSiteInfo(newSiteCodeName);

        // Ensure uniqueness of the site code name
        if ((existingSiteInfo != null) && (existingSiteInfo.SiteID != siteInfo.SiteID))
        {
            Control.StopProcessing = true;
            Control.AddError(ResHelper.GetString("Administration-Site_Edit.SiteExists"));
        }

        // Correct domain name
        string domainName = ValidationHelper.GetString(Control.Data["SiteDomainName"], String.Empty);
        if (!String.IsNullOrEmpty(domainName))
        {
            Control.Data["SiteDomainName"] = URLHelper.RemoveProtocol(domainName);
        }

        // Stop the site
        siteInfo.Status = SiteStatusEnum.Stopped;

        // Remember the former site code name
        formerCodeName = siteInfo.SiteName;
    }


    /// <summary>
    /// Handles 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)
    {
        string newSiteCodeName = ValidationHelper.GetString(Control.GetFieldValue("SiteName"), String.Empty);

        if (newSiteCodeName.ToLowerCSafe() != siteInfo.SiteName.ToLowerCSafe())
        {
            // Clear settings if sitename changes
            SettingsKeyInfoProvider.ClearCachedValues(true);

            // Reindex hashtable with sessions if SiteName changes and change info message                
            SessionManager.ReindexSessionsInfosHashtable(formerCodeName, siteInfo.SiteName);
            if (SearchIndexInfoProvider.SearchEnabled)
            {
                Control.ShowInformation(String.Format(ResHelper.GetString("general.changessaved") + " " + ResHelper.GetString("srch.indexrequiresrebuild"), "<a href=\"javascript:" + ControlsHelper.GetPostBackEventReference(Control.ObjectManager.HeaderActions, "RebuildSiteIndex;") + "\">" + ResHelper.GetString("General.clickhere") + "</a>"));
            }
        }

        // Remove cached cultures for site
        CultureSiteInfoProvider.ClearSiteCultures(true);

        // Run the site if it was running previously
        try
        {
            if (runSite)
            {
                DataSet ds = SiteInfoProvider.CheckDomainNameForCollision(siteInfo.DomainName, siteInfo.SiteID);
                if (!DataHelper.DataSourceIsEmpty(ds))
                {
                    SiteInfo runningSiteInfo = SiteInfoProvider.GetSiteInfo(ValidationHelper.GetInteger(ds.Tables[0].Rows[0]["SiteID"], 0));
                    if (runningSiteInfo != null)
                    {
                        string collisionSite = HTMLHelper.HTMLEncode(runningSiteInfo.DisplayName);
                        string collisionDomain = HTMLHelper.HTMLEncode(ValidationHelper.GetString(ds.Tables[0].Rows[0]["SiteDomainAliasName"], ""));

                        Control.ShowWarning(String.Format(ResHelper.GetString("SiteDomain.RunError"), collisionSite, collisionDomain, HTMLHelper.HTMLEncode(siteInfo.DisplayName)));
                    }
                }
                else
                {
                    // Run current site
                    SiteInfoProvider.RunSite(siteInfo.SiteName);
                }
            }
        }
        catch (RunningSiteException ex)
        {
            Control.ShowError(ex.Message);
        }
    }


    /// <summary>
    /// Handles the event that occurs when user confirms that the site 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)
    {
        // Stop the site in order to finish saving the site
        siteInfo.Status = SiteStatusEnum.Stopped;
        Control.SaveData(null);
    }


    /// <summary>
    /// Handles the event that occurs when link button "click here" is clicked.
    /// </summary>
    /// <param name="sender">Sender object</param>
    /// <param name="e">Event argument</param>
    private void RebuildSiteIndex(object sender, EventArgs e)
    {
        // Rebuild search index
        if (SearchIndexInfoProvider.SearchEnabled)
        {
            SearchIndexInfoProvider.RebuildSiteIndexes(siteInfo.SiteID);
            Control.ShowInformation(ResHelper.GetString("srch.index.rebuildstarted"));
        }
    }

    #endregion
}