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/SiteEditCulturesExtender.cs
using System;
using System.Data;
using System.Web.UI;

using CMS;
using CMS.Base;
using CMS.DataEngine;
using CMS.DocumentEngine;
using CMS.ExtendedControls;
using CMS.Helpers;
using CMS.LicenseProvider;
using CMS.Localization;
using CMS.SiteProvider;
using CMS.UIControls;

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

/// <summary>
/// Site edit culture extender.
/// </summary>
public class SiteEditCulturesExtender : ControlExtender<UniSelector>
{
    #region "Variables"

    private SiteInfo siteInfo;
    private string currentValues;
    private const string ASSIGN_ARGUMENT_NAME = "assign";
    bool reloadData = false;

    #endregion


    #region "Methods"

    /// <summary>
    /// Extender initialization.
    /// </summary>
    public override void OnInit()
    {
        Control.OnSelectionChanged += Control_OnSelectionChanged;
        Control.Page.Load += Page_Load;
        Control.Page.PreRender += Page_PreRender;

        siteInfo = Control.UIContext.EditedObject as SiteInfo;
    }


    /// <summary>
    /// Page pre-render event handling.
    /// </summary>
    /// <param name="sender">Sender object</param>
    /// <param name="e">Event argument</param>
    protected void Page_PreRender(object sender, EventArgs e)
    {
        if (siteInfo == null)
        {
            return;
        }

        if (reloadData)
        {
            Control.Visible = true;
            Control.Reload(true);
        }

        // Check if site hasn't assigned more cultures than license approve
        if (!CultureSiteInfoProvider.LicenseVersionCheck(siteInfo.DomainName, FeatureEnum.Multilingual, ObjectActionEnum.Insert))
        {
            Control.ButtonAddItems.Enabled = false;
        }
        else if (!CultureSiteInfoProvider.LicenseVersionCheck(siteInfo.DomainName, FeatureEnum.Multilingual, ObjectActionEnum.Edit))
        {
            Control.ShowError(ResHelper.GetString("licenselimitation.siteculturesexceeded"));
            Control.ButtonAddItems.Enabled = false;
        }
    }


    /// <summary>
    /// Page load event handling.
    /// </summary>
    /// <param name="sender">Sender object</param>
    /// <param name="e">Event argument</param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (siteInfo == null)
        {
            return;
        }

        HandleReAssigningCulture();

        Control.Visible = true;
        bool multilingual = LicenseHelper.CheckFeature(URLHelper.GetDomainName(siteInfo.DomainName), FeatureEnum.Multilingual);
        bool cultureOnSite = CultureSiteInfoProvider.IsCultureOnSite(CultureHelper.GetDefaultCultureCode(siteInfo.SiteName), siteInfo.SiteName);
        if (!multilingual && !cultureOnSite)
        {
            Control.Visible = false;

            // Add link that assign the default content culture to the site
            LocalizedHyperlink linkButton = new LocalizedHyperlink()
            {
                ResourceString = "sitecultures.assigntodefault",
                NavigateUrl = "javascript:" + ControlsHelper.GetPostBackEventReference(Control.Page, ASSIGN_ARGUMENT_NAME) + ";"
            };

            Control.Parent.Controls.Add(linkButton);
        }
        else
        {
            // Redirect only if cultures not exceeded => to be able to unassign
            if (!CultureSiteInfoProvider.LicenseVersionCheck(siteInfo.DomainName, FeatureEnum.Multilingual, ObjectActionEnum.Edit))
            {
                LicenseHelper.CheckFeatureAndRedirect(URLHelper.GetDomainName(siteInfo.DomainName), FeatureEnum.Multilingual);
            }
        }

        // Get the active cultures from DB
        DataSet ds = CultureInfoProvider.GetCultures("CultureID IN (SELECT CultureID FROM CMS_SiteCulture WHERE SiteID = " + siteInfo.SiteID + ")", null, 0, "CultureID");
        if (!DataHelper.DataSourceIsEmpty(ds))
        {
            currentValues = TextHelper.Join(";", DataHelper.GetStringValues(ds.Tables[0], "CultureID"));
        }  
    }


    /// <summary>
    /// Handles OnSelectionChanged event of the UniSelector.
    /// </summary>
    /// <param name="sender">Sender object</param>
    /// <param name="e">Event argument</param>
    protected void Control_OnSelectionChanged(object sender, EventArgs e)
    {
        if (siteInfo == null)
        {
            return;
        }

        bool reloadNeeded = false;

        // Remove old items
        string newValues = ValidationHelper.GetString(Control.Value, String.Empty);
        string removedCultures = DataHelper.GetNewItemsInList(newValues, currentValues);
        if (!String.IsNullOrEmpty(removedCultures))
        {
            string[] removedCultureIDs = removedCultures.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            if (removedCultureIDs != null)
            {
                // Initialize tree provider
                TreeProvider tree = new TreeProvider();

                // Add all new items to site
                foreach (string cultureID in removedCultureIDs)
                {
                    CultureInfo ci = CultureInfoProvider.GetCultureInfo(ValidationHelper.GetInteger(cultureID, 0));
                    if (ci != null)
                    {
                        // Get the documents assigned to the culture being removed
                        DataSet nodes = tree.SelectNodes(siteInfo.SiteName, "/%", ci.CultureCode, false, null, null, null, -1, false);
                        if (DataHelper.DataSourceIsEmpty(nodes))
                        {
                            CultureSiteInfoProvider.RemoveCultureFromSite(ci.CultureCode, siteInfo.SiteName);
                        }
                        else
                        {
                            reloadNeeded = true;
                            Control.AddError(String.Format(ResHelper.GetString("site_edit_cultures.errorremoveculturefromsite"), ci.CultureCode) + '\n', null);
                        }
                    }
                }
            }
        }

        // Catch license limitations Exception  
        try
        {
            // Add new items
            string newCultures = DataHelper.GetNewItemsInList(currentValues, newValues);
            if (!String.IsNullOrEmpty(newCultures))
            {
                string[] newCultureIDs = newCultures.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                if (newCultureIDs != null)
                {
                    // Add all new items to site
                    foreach (string cultureID in newCultureIDs)
                    {
                        int id = ValidationHelper.GetInteger(cultureID, 0);
                        CultureSiteInfoProvider.AddCultureToSite(id, siteInfo.SiteID);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            reloadNeeded = true;
            Control.ShowError(ex.Message);
        }

        if (reloadNeeded)
        {
            // Get the active cultures from DB
            DataSet ds = CultureInfoProvider.GetCultures("CultureID IN (SELECT CultureID FROM CMS_SiteCulture WHERE SiteID = " + siteInfo.SiteID + ")", null, 0, "CultureID");
            if (!DataHelper.DataSourceIsEmpty(ds))
            {
                currentValues = TextHelper.Join(";", DataHelper.GetStringValues(ds.Tables[0], "CultureID"));
                Control.Value = currentValues;
                Control.Reload(true);
            }
        }
    }


    /// <summary>
    /// Assign the culture that is set as default content culture to the current site.
    /// </summary>
    private void HandleReAssigningCulture()
    {
        if (RequestHelper.IsPostBack())
        {
            string arg = ValidationHelper.GetString(Control.Page.Request[Page.postEventArgumentID], String.Empty);
            if (arg.EqualsCSafe(ASSIGN_ARGUMENT_NAME))
            {
                string culture = CultureHelper.GetDefaultCultureCode(siteInfo.SiteName);

                // Only default content culture is allowed to be assigned to the site in case there is no multilingual license
                CultureSiteInfoProvider.RemoveSiteCultures(siteInfo.SiteName);
                CultureSiteInfoProvider.AddCultureToSite(culture, siteInfo.SiteName);

                // Get info object of the default content culture to set value of the UniSelector
                CultureInfo ci = CultureInfoProvider.GetCultureInfoForCulture(culture);
                if (ci != null)
                {
                    Control.Value = Convert.ToString(ci.CultureID);
                    reloadData = true;
                }

                Control.ShowChangesSaved();
            }
        }
    }

    #endregion
}