Question

I am using ugc conditional statement in my code, the equals condition is working fine, but how can be used other conditional operator like ">" "<" and "Not Equals".

<%
HttpContext.Current.Items["CommentCount"] = 0;
%>

<ugc:Choose runat="server">
  <ugc:When test="ugcItemStats.numberOfComments > CommentCount" runat="server">
         HTML1
  </ugc:When>
  <ugc:Otherwise runat="server">
         HTML2
  </ugc:Otherwise>
</ugc:Choose>

What operator should be used, if numberofComments is greater than 0, I tried like this way and also tried "notequals" instead of ">" but its does't work.

Please suggest

Was it helpful?

Solution

Tridion ug:when will be work only with " equal " and "==" if you want to use other operator then you have to create the other customer control for this.

I have created and i hope it will be work with "==,>=",<=,>,<,!=" operator.

its working in my project.

using System;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;

namespace Tridion.ContentDelivery.UGC.Web.UI
{
    [DefaultProperty("Test"), ToolboxData("<{0}:WhenCond runat=server></{0}:WhenCond>"), ParseChildren(ChildrenAsProperties = false)]
    public class WhenCond : BaseUGCServerControl
    {
        private string test;
        private static Regex pattern = new Regex(@"\.");
        protected virtual bool Condition()
        {
            if (this.test == null)
            {
                return false;
            }
            string[] sep = new string[] { "==", "<", ">", "<=", ">=" ,"!="};
            string[] testArray = test.Split(sep, StringSplitOptions.None);
            if (testArray.Length == 2)
            {
                object value1 = EvaluateVariable(testArray[0].Trim(), HttpContext.Current);
                object value2 = EvaluateVariable(testArray[1].Trim(), HttpContext.Current);
                if (value1 != null && value2 != null)
                {
                    if (isNumeric(value1.ToString(), NumberStyles.Number) && isNumeric(value2.ToString(), NumberStyles.Number))
                    {
                        return NumericCondition(double.Parse(value1.ToString()), double.Parse(value2.ToString()), GetSepartor());
                    }
                    else
                    {
                        return AlphaNumericCondition(value1.ToString(), value2.ToString(), GetSepartor());
                    }
                }
                else
                {
                    return false;
                }
            }
            return false;
        }

        public static object EvaluateVariable(string varProperty, HttpContext usedContext)
        {
            if (!string.IsNullOrEmpty(varProperty))
            {
                string[] strArray = pattern.Split(varProperty);
                if (!string.IsNullOrEmpty(strArray[0]))
                {
                    object obj2 = usedContext.Items[strArray[0]];
                    if (obj2 != null)
                    {
                        object obj3 = obj2;
                        for (int i = 1; i < strArray.Length; i++)
                        {
                            if (obj3 != null)
                            {
                                string str = strArray[i];
                                if (!string.IsNullOrEmpty(str))
                                {
                                    string str2 = str.Substring(0, 1);
                                    string str3 = str.Substring(1);
                                    string name = str2.ToUpper() + str3;
                                    PropertyInfo property = obj3.GetType().GetProperty(name);
                                    if (property != null)
                                    {
                                        obj3 = property.GetValue(obj3, null);
                                    }
                                }
                            }
                        }
                        return obj3;
                    }
                }
            }
            return null;
        }

        public bool isNumeric(string val, System.Globalization.NumberStyles NumberStyle)
        {
            Double result;
            return Double.TryParse(val, NumberStyle, System.Globalization.CultureInfo.CurrentCulture, out result);
        }

        private string GetSepartor()
        {
            string sept = string.Empty;
            sept = this.test.Contains("==") ? "==" : string.Empty;
            sept = string.IsNullOrEmpty(sept) ?(this.test.Contains(">") ? ">" : string.Empty):sept;
            sept = string.IsNullOrEmpty(sept) ? (this.test.Contains("<") ? "<" : string.Empty) : sept;
            sept = string.IsNullOrEmpty(sept) ?(this.test.Contains(">=") ? ">=" : string.Empty):sept;
            sept = string.IsNullOrEmpty(sept) ?(this.test.Contains("<=") ? "<=" : string.Empty):sept;
            sept = string.IsNullOrEmpty(sept) ? (this.test.Contains("!=") ? "!=" : string.Empty) : sept;
            return sept;
        }

        private bool NumericCondition(double value1, double value2, string sept)
        {
            bool returnFlag = false;
            switch (sept)
            {
                case "==":
                    returnFlag = (value1 == value2);
                    break;
                case ">":
                    returnFlag = (value1 > value2);
                    break;
                case "<":
                    returnFlag = (value1 < value2);
                    break;
                case ">=":
                    returnFlag = (value1 >= value2);
                    break;
                case "<=":
                    returnFlag = (value1 <= value2);
                    break;
                case "!=":
                    returnFlag = (value1 != value2);
                    break;
            }
            return returnFlag;
        }

        private bool AlphaNumericCondition(string value1, string value2, string sept)
        {
            bool returnFlag = false;
            switch (sept)
            {
                case "==":
                    returnFlag = (value1.CompareTo(value2) == 0);
                    break;
                case "!=":
                    returnFlag = (!value1.Equals(value2));
                    break;
                case ">":
                    returnFlag = (value1.CompareTo(value2) > 0);
                    break;
                case "<":
                    returnFlag = (value1.CompareTo(value2) < 0);
                    break;
            }
            return returnFlag;
        }

        protected override void Render(HtmlTextWriter writer)
        {
            if ((HttpContext.Current != null) && (HttpContext.Current.Application != null))
            {
                Control parent = this.Parent;
                if (!(parent is Choose))
                {
                    throw new InvalidOperationException("WhenCond control must have a Tridion Web UI Choose server control as parent!!!");
                }
                Choose choose = (Choose)parent;
                if (!choose.AlreadyMatchedCondition() && this.Condition())
                {
                    choose.MatchedCondition();
                    this.RenderChildren(writer);
                }
            }
        }

        [Category("Appearance"), DefaultValue(""), Bindable(true)]
        public string Test
        {
            get
            {
                return this.test;
            }
            set
            {
                this.test = value;
            }
        }
    }
}

implementaion in aspx page

<%@ Register assembly="Tridion.Custom.Web.UI" namespace="Tridion.ContentDelivery.UGC.Web.UI" tagprefix="cc1" %>


<ugc:Choose runat="server">
  <cc1:WhenCond test="ugcItemStats.numberOfComments > CommentCount" runat="server">
         HTML1
  </cc1:WhenCond>
  <ugc:Otherwise runat="server">
         HTML2
  </ugc:Otherwise>
</ugc:Choose>

if you face any problem please let me know.

OTHER TIPS

To best of my knowledge, When conditions support only two conditions either == and equals. So you may have to use these to workaround your test conditions (both are same as equal).

Could someone validate or confirm that above is true?

Have you tried using &gt;? That normally does the trick for similar things, e.g. XPath.

Sorry, the When tag currently only supports "==" or "equals".

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top