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/SiteEditCulturesExtender.cs
using System;
using System.Collections.Generic;
using System.Linq;
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;

    #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
        var cultureIds = GetCurrentCultureIds();
        if (cultureIds.Count > 0)
        {
            currentValues = TextHelper.Join(";", cultureIds);
        }
    }


    /// <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 allCulturesProcessed = true;

        // Remove old items
        var removedCultureIds = GetRemovedCultureIds();
        if (removedCultureIds != null)
        {
            allCulturesProcessed &= RemoveFromSite(removedCultureIds);
        }

        // Add new items
        var newCultureIds = GetAddedCultureIds();
        if (newCultureIds != null)
        {
            allCulturesProcessed &= AddToSite(newCultureIds);
        }

        // Refresh selection with skipped cultures
        if (!allCulturesProcessed)
        {
            var cultureIds = GetCurrentCultureIds();
            if (cultureIds.Count > 0)
            {
                currentValues = TextHelper.Join(";", cultureIds);
                Control.Value = currentValues;
                Control.Reload(true);
            }
        }
    }


    /// <summary>
    /// Returns list of current culture identifiers.
    /// </summary>
    private IList<int> GetCurrentCultureIds()
    {
        return CultureInfoProvider.GetCultures()
                                  .Column("CultureID")
                                  .WhereIn("CultureID", CultureSiteInfoProvider.GetCultureSites()
                                                                               .Column("CultureID")
                                                                               .WhereEquals("SiteID", siteInfo.SiteID))
                                  .GetListResult<int>();
    }


    /// <summary>
    /// Returns list of culture identifiers which should be added to site.
    /// </summary>
    private IEnumerable<int> GetAddedCultureIds()
    {
        var selectedValues = ValidationHelper.GetString(Control.Value, String.Empty);
        var newValues = DataHelper.GetNewItemsInList(currentValues, selectedValues);
        if (string.IsNullOrEmpty(newValues))
        {
            return null;
        }

        return newValues
            .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToList();
    }


    /// <summary>
    /// Returns list of culture identifiers which should be removed from site.
    /// </summary>
    private IEnumerable<int> GetRemovedCultureIds()
    {
        var selectedValues = ValidationHelper.GetString(Control.Value, String.Empty);
        var removedValues = DataHelper.GetNewItemsInList(selectedValues, currentValues);
        if (string.IsNullOrEmpty(removedValues))
        {
            return null;
        }

        return removedValues
            .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToList();
    }


    /// <summary>
    /// Assigns given cultures to the edited site.
    /// </summary>
    /// <param name="cultureIds">Identifiers of cultures meant for adding.</param>
    /// <returns>Returns <c>true</c> if all cultures were successfully added.</returns>
    private bool AddToSite(IEnumerable<int> cultureIds)
    {
        bool allCulturesAdded = true;
        try
        {
            bool changed = false;
            foreach (int cultureId in cultureIds)
            {
                CultureSiteInfoProvider.AddCultureToSite(cultureId, siteInfo.SiteID);
                changed = true;
            }

            if (changed)
            {
                Control.ShowChangesSaved();
            }
        }
        catch (Exception ex)
        {
            allCulturesAdded = false;
            Control.ShowError(ex.Message);
        }

        return allCulturesAdded;
    }


    /// <summary>
    /// Removes cultures from edited site. Default culture is skipped and is not removed. Also cultures which
    /// are assigned to documents are not removed. 
    /// </summary>
    /// <param name="cultureIds">Set of culture identifiers to delete.</param>
    /// <returns>Returns <c>true</c> if all cultures were successfully removed.</returns>
    private bool RemoveFromSite(IEnumerable<int> cultureIds)
    {
        bool allCulturesDeleted = true;
        bool changed = false;
        var defaultCultureCode = CultureHelper.GetDefaultCultureCode(siteInfo.SiteName);
        var tree = new TreeProvider();

        // Remove all selected items from site
        foreach (int cultureId in cultureIds)
        {
            var culture = CultureInfoProvider.GetCultureInfo(cultureId);
            if (culture == null)
            {
                continue;
            }

            // Skip default cultrue deletion
            if (culture.CultureCode.EqualsCSafe(defaultCultureCode, true))
            {
                allCulturesDeleted = false;
                Control.AddError(String.Format(ResHelper.GetString("site_edit_cultures.errordeletedefaultculture"), HTMLHelper.HTMLEncode(culture.CultureName)) + '\n');
                continue;
            }

            var cultureDocumentsCount = tree.SelectNodes()
                                            .OnSite(siteInfo.SiteName)
                                            .CombineWithDefaultCulture(false)
                                            .Culture(culture.CultureCode)
                                            .Published(false)
                                            .Count;

            // Skip culture if any document translated to this culture
            if (cultureDocumentsCount > 0)
            {
                allCulturesDeleted = false;
                Control.AddError(String.Format(ResHelper.GetString("site_edit_cultures.errorremoveculturefromsite"), HTMLHelper.HTMLEncode(culture.CultureName)) + '\n');
                continue;
            }

            CultureSiteInfoProvider.RemoveCultureFromSite(culture.CultureCode, siteInfo.SiteName);
            changed = true;
        }

        if (changed)
        {
            Control.ShowChangesSaved();
        }

        return allCulturesDeleted;
    }


    /// <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
}