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/CMSFormControls/System/MultiObjectBindingControl.ascx.cs
using System;
using System.Linq;

using CMS.Base;
using CMS.DataEngine;
using CMS.EventLog;
using CMS.FormControls;
using CMS.Helpers;

public partial class CMSFormControls_System_MultiObjectBindingControl : FormEngineUserControl
{
    #region "Variables"

    private string mTargetObjectIDColumn = string.Empty;
    private string mCurrentObjectIDColumn = string.Empty;

    #endregion


    #region "Properties"

    /// <summary>
    /// Gets or sets form control value. Selected items count is used.
    /// </summary>
    public override object Value
    {
        get
        {
            string items = ValidationHelper.GetString(uniSelector.Value, String.Empty);
            return items.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Length;

        }
        set
        {
            uniSelector.Value = value;
        }
    }


    /// <summary>
    /// Binding object type which stores binding relationship.
    /// </summary>
    public string BindingObjectType
    {
        get
        {
            return ValidationHelper.GetString(GetValue("BindingObjectType"), string.Empty);
        }
        set
        {
            SetValue("BindingObjectType", value);
        }
    }


    /// <summary>
    /// Column name of current object in binding table.
    /// If empty, current object ID column is used.
    /// </summary>
    public string ObjectColumnName
    {
        get
        {
            return ValidationHelper.GetString(GetValue("ObjectColumnName"), string.Empty);
        }
        set
        {
            SetValue("ObjectColumnName", value);
        }
    }


    /// <summary>
    /// Column name of target object in binding table.
    /// If empty, target object ID column is used.
    /// </summary>
    public string TargetObjectColumnName
    {
        get
        {
            return ValidationHelper.GetString(GetValue("TargetObjectColumnName"), string.Empty);
        }
        set
        {
            SetValue("TargetObjectColumnName", value);
        }
    }

    /// <summary>
    /// Type of object to create relationship with.
    /// </summary>
    public string TargetObjectType
    {
        get
        {
            return ValidationHelper.GetString(GetValue("TargetObjectType"), string.Empty);
        }
        set
        {
            SetValue("TargetObjectType", value);
        }
    }


    /// <summary>
    /// Uni selector where condition
    /// </summary>
    public string WhereCondition
    {
        get
        {
            return ValidationHelper.GetString(GetValue("WhereCondition"), string.Empty);
        }
        set
        {
            SetValue("WhereCondition", value);
        }
    }


    /// <summary>
    /// Uni selector custom filter path
    /// </summary>
    public string FilterControl
    {
        get
        {
            return ValidationHelper.GetString(GetValue("FilterControl"), string.Empty);
        }
        set
        {
            SetValue("FilterControl", value);
        }
    }


    /// <summary>
    /// Determines whether to show default name filter.
    /// </summary>    
    public bool UseDefaultNameFilter
    {
        get
        {
            return ValidationHelper.GetBoolean(GetValue("UseDefaultNameFilter"), true);
        }
        set
        {
            SetValue("UseDefaultNameFilter", value);
        }
    }


    /// <summary>
    /// Uni selector resource prefix.
    /// </summary>
    public string ResourcePrefix
    {
        get
        {
            return ValidationHelper.GetString(GetValue("ResourcePrefix"), string.Empty);
        }
        set
        {
            SetValue("ResourcePrefix", value);
        }
    }


    /// <summary>
    /// Uni selector display name format.
    /// </summary>
    public string DisplayNameFormat
    {
        get
        {
            return ValidationHelper.GetString(GetValue("DisplayNameFormat"), string.Empty);
        }
        set
        {
            SetValue("DisplayNameFormat", value);
        }
    }


    /// <summary>
    /// Current form object info.
    /// </summary>
    private GeneralizedInfo CurrentObjectInfo
    {
        get
        {
            return (BaseInfo)Form.Data;
        }
    }


    /// <summary>
    /// Target object ID column name.
    /// </summary>
    private string TargetObjectIDColumn
    {
        get
        {
            if (string.IsNullOrEmpty(mTargetObjectIDColumn))
            {
                if (string.IsNullOrEmpty(TargetObjectColumnName))
                {
                    GeneralizedInfo obj = ModuleManager.GetReadOnlyObject(Form.ResolveMacros(TargetObjectType));
                    mTargetObjectIDColumn = obj.TypeInfo.IDColumn;
                }
                else
                {
                    mTargetObjectIDColumn = TargetObjectIDColumn;
                }
            }

            return mTargetObjectIDColumn;
        }
    }


    /// <summary>
    /// Current object ID column name.
    /// </summary>
    private string CurrentObjectIDColumn
    {
        get
        {
            if (string.IsNullOrEmpty(mCurrentObjectIDColumn))
            {
                mCurrentObjectIDColumn = string.IsNullOrEmpty(ObjectColumnName) ? CurrentObjectInfo.TypeInfo.IDColumn : ObjectColumnName;
            }

            return mCurrentObjectIDColumn;
        }
    }

    #endregion


    #region "Life cycle"

    protected void Page_Load(object sender, EventArgs e)
    {
        if ((Form == null) || (CurrentObjectInfo == null))
        {
            return;
        }

        Form.OnAfterSave += Form_OnAfterSave;

        uniSelector.DisplayNameFormat = DisplayNameFormat;
        uniSelector.ObjectType = TargetObjectType;
        uniSelector.ResourcePrefix = ResourcePrefix;
        uniSelector.WhereCondition = WhereCondition;
        uniSelector.FilterControl = FilterControl;
        uniSelector.UseDefaultNameFilter = UseDefaultNameFilter;

        // Check if binding object type exists and has correct properties
        if (BindingObjectTypeExists(Form.ResolveMacros(BindingObjectType)))
        {
            if (!RequestHelper.IsPostBack())
            {
                // Set up original selector values
                uniSelector.Value = GetOriginalSelectorData();
            }
        }
        else
        {
            uniSelector.Visible = false;
        }
    }

    #endregion


    #region "Page events"

    /// <summary>
    /// Saves binding relationships for edited object.
    /// </summary>
    private void Form_OnAfterSave(object sender, EventArgs e)
    {
        // Check if object for which are binding objects created exists
        if (CurrentObjectInfo == null)
        {
            return;
        }

        // Resolve binding object type name
        string resolvedObjectType = Form.ResolveMacros(BindingObjectType);

        // Update binding objects
        try
        {
            string originalValues = GetOriginalSelectorData();

            // Remove old items
            string newValues = ValidationHelper.GetString(uniSelector.Value, null);
            string items = DataHelper.GetNewItemsInList(newValues, originalValues);
            if (!String.IsNullOrEmpty(items))
            {
                string[] newItems = items.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                // Remove bindings
                foreach (string item in newItems)
                {
                    BaseInfo bindingObj = SetBindingObject(item.ToInteger(0), resolvedObjectType);
                    bindingObj.Delete();
                }
            }

            // Add new items
            items = DataHelper.GetNewItemsInList(originalValues, newValues);
            if (!String.IsNullOrEmpty(items))
            {
                string[] newItems = items.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                // Create new binding
                foreach (string item in newItems)
                {
                    BaseInfo bindingObj = SetBindingObject(item.ToInteger(0), resolvedObjectType);
                    bindingObj.Insert();
                }
            }
        }
        catch (Exception ex)
        {
            EventLogProvider.LogException("ObjectBinding", "BindObject", ex);
        }
    }


    /// <summary>
    /// Returns true if binding object type exists. Otherwise, logs exception in event log.
    /// </summary>
    /// <param name="objectType">Object type to check existence for.</param>
    private bool BindingObjectTypeExists(string objectType)
    {
        BaseInfo bindingObject = ModuleManager.GetReadOnlyObject(objectType);
        if ((bindingObject == null) || (bindingObject.ColumnNames.Count < 2) || (!bindingObject.ContainsColumn(CurrentObjectIDColumn)))
        {
            EventLogProvider.LogEvent(EventType.ERROR, "ObjectBinding", "BindObject", "Object " + CurrentObjectInfo.ObjectDisplayName + " cannot be bound.");
            return false;
        }

        return true;
    }


    /// <summary>
    /// Creates binding object.
    /// </summary>
    /// <param name="targetObjectID">ID of object to create relationship with.</param>
    /// <param name="bindingObjectType">Type of object which stores binding relationship</param>
    private BaseInfo SetBindingObject(int targetObjectID, string bindingObjectType)
    {
        BaseInfo bindingObj = ModuleManager.GetObject(bindingObjectType);

        bindingObj.SetValue(CurrentObjectIDColumn, CurrentObjectInfo.ObjectID);
        bindingObj.SetValue(TargetObjectIDColumn, targetObjectID);

        return bindingObj;
    }

    #endregion


    #region "Helper methods"

    /// <summary>
    /// Finds dataset of stored binding objects and joins target object IDs from this dataset using ; separator.
    /// </summary>
    private string GetOriginalSelectorData()
    {
        var bindingObjectQuery = new ObjectQuery(BindingObjectType);
        var bindedItemsIDs = bindingObjectQuery.Column(TargetObjectIDColumn)
                                               .WhereEquals(CurrentObjectIDColumn, CurrentObjectInfo.ObjectID);

        string originalValues = string.Empty;
        if (!DataHelper.DataSourceIsEmpty(bindedItemsIDs))
        {
            originalValues = TextHelper.Join(";", DataHelper.GetStringValues(bindedItemsIDs.Tables[0], TargetObjectIDColumn));
        }

        return originalValues;
    }

    #endregion
}