Ejemplo n.º 1
0
        internal static string GetValue(string name, SNC.Content parentContent, bool storedData = false, CultureInfo cultureInfo = null, bool formattedValue = true)
        {
            string[] parts = name.Split(new char[] { '.' });
            if (parts.Length == 0)
            {
                return("");
            }

            string currPart = "";

            #region special values

            if (parts[0].ToLower() == "current" && parts.Length > 1)
            {
                switch (parts[1].ToLower())
                {
                case "url":
                    if (parts.Length > 2)
                    {
                        switch (parts[2].ToLower())
                        {
                        case "hostname":
                            foreach (string url in SNP.Page.Current.Site.UrlList.Keys)
                            {
                                if (SenseNet.Portal.Virtualization.PortalContext.Current.OriginalUri.ToString().IndexOf(string.Concat(SenseNet.Portal.Virtualization.PortalContext.Current.OriginalUri.Scheme, "://", url, "/")) == 0)
                                {
                                    return(url);
                                }
                            }
                            return("");

                        case "host":
                            foreach (string url in SNP.Page.Current.Site.UrlList.Keys)
                            {
                                if (SenseNet.Portal.Virtualization.PortalContext.Current.OriginalUri.ToString().IndexOf(string.Concat(SenseNet.Portal.Virtualization.PortalContext.Current.OriginalUri.Scheme, "://", url, "/")) == 0)
                                {
                                    return(string.Concat(SenseNet.Portal.Virtualization.PortalContext.Current.OriginalUri.Scheme, "://", url));
                                }
                            }
                            return("");

                        case "name":
                            return(SenseNet.Portal.Virtualization.PortalContext.Current.OriginalUri.OriginalString);

                        default:
                            return("");
                        }
                    }
                    else
                    {
                        return("");
                    }

                case "user":
                    if (User.Current != null && parts.Length > 1)
                    {
                        switch (parts[2].ToLower())
                        {
                        case "isauthenticated":
                            return(User.Current.IsAuthenticated ? "1" : "0");

                        default:
                            return(((User)User.Current).GetProperty(parts[2]).ToString());
                        }
                    }
                    else
                    {
                        return("");
                    }

                case "site":
                    if (PortalContext.Current.Site != null)
                    {
                        return(PortalContext.Current.Site.GetProperty(parts[2]).ToString());
                    }
                    else
                    {
                        return("");
                    }

                case "page":
                    if (PortalContext.Current.Page != null)
                    {
                        return(PortalContext.Current.Page.GetProperty(parts[2]).ToString());
                    }
                    else
                    {
                        return("");
                    }
                }
            }

            #endregion

            object obj             = null;
            object previousListObj = null; // Needed because of IList fields with no indexing
            foreach (string _currPart in parts)
            {
                currPart = _currPart;
                int index = 0;
                //bool isIndexed = false;

                #region Custom properties

                // Check if current part is indexed and if it is get the index and take it off the current part
                if (IsIndexedField(currPart))
                {
                    index = GetIndexedFieldValue(currPart);
                    //isIndexed = true;
                    currPart = StripIndex(currPart);
                }

                if (currPart == "Count")
                {
                    if (previousListObj is ICollection)
                    {
                        return(((ICollection)previousListObj).Count.ToString());
                    }
                    else if (obj is ICollection)
                    {
                        return(((ICollection)obj).Count.ToString());
                    }
                }

                if (currPart == "AsList()" || Regex.IsMatch(currPart, "AsList[(](['\"](.*)['\"])[)]"))
                {
                    if (previousListObj is IList)
                    {
                        Match  firstMatch      = Regex.Match(currPart, "AsList[(](['\"](.*)['\"])[)]");
                        string separatorString = firstMatch.Groups[1].Value;
                        if (separatorString == String.Empty)
                        {
                            separatorString = ", "; // default
                        }
                        List <string> elements = new List <string>();
                        foreach (object currObj in previousListObj as IList)
                        {
                            elements.Add(currObj.ToString());
                        }
                        return(string.Join(separatorString, elements.ToArray()));
                    }
                }

                if (_currPart == "Load()" && obj is string)
                {
                    obj = Node.Load <Node>(obj as string);
                    if (!(obj is Node))
                    {
                        return("");
                    }
                    else
                    {
                        parentContent = SNC.Content.Load(((Node)obj).Id);
                    }
                    continue;
                }

                if (currPart == "SiteRelativePath")
                {
                    if (SNP.Page.Current.Site != null && ((Node)parentContent.ContentHandler).Path.StartsWith(SNP.Page.Current.Site.Path))
                    {
                        return(((Node)parentContent.ContentHandler).Path.Substring(SNP.Page.Current.Site.Path.Length));
                    }
                    else
                    {
                        currPart = "Path";
                    }
                }

                if (currPart == "PageRelativePath")
                {
                    if (SNP.Page.Current != null && ((Node)parentContent.ContentHandler).Path.StartsWith(SNP.Page.Current.Path))
                    {
                        return(((Node)parentContent.ContentHandler).Path.Substring(String.Concat(SNP.Page.Current.Path, "/").Length));
                    }
                    else
                    {
                        currPart = "Path";
                    }
                }

                if (currPart == "Children" && obj is IFolder)
                {
                    IFolder f = obj as IFolder;
                    previousListObj = f.Children;
                    obj             = f.Children;
                    if (index < f.ChildCount)
                    {
                        obj           = f.Children.ToArray <Node>()[index];
                        parentContent = SNC.Content.Load(((Node)obj).Id);
                    }
                    continue;
                }

                // Check for 'string' parts
                if (Regex.IsMatch(_currPart, @"'(.+)'"))
                {
                    if (obj == null || obj is string)
                    {
                        Match firstMatch = Regex.Match(_currPart, @"'(.+)'");
                        obj += firstMatch.Groups[1].Value;
                        continue;
                    }
                    else
                    {
                        return("");
                    }
                }

                #region Custom Field property mappings

                if (obj is SenseNet.ContentRepository.Fields.HyperLinkField.HyperlinkData)
                {
                    var hyperlinkObj = (SenseNet.ContentRepository.Fields.HyperLinkField.HyperlinkData)obj;
                    if (currPart == "Href")
                    {
                        obj = hyperlinkObj.Href;
                    }
                    if (currPart == "Text")
                    {
                        obj = hyperlinkObj.Text;
                    }
                    if (currPart == "Title")
                    {
                        obj = hyperlinkObj.Title;
                    }
                    if (currPart == "Target")
                    {
                        obj = hyperlinkObj.Target;
                    }
                    continue;
                }

                #endregion

                #endregion

                // If parent content is empty next part can not be resolved. Later on however something could be returned if 'string' or Load() part is present
                if (parentContent == null)
                {
                    obj = null;
                    continue;
                }

                // Try to get the property of the current part
                try
                {
                    if (storedData)
                    {
                        obj = parentContent.GetStoredValue(_currPart);
                    }
                    else if (cultureInfo == null)
                    {
                        Field field;

                        //try to get the formatted value in case of number/currency and datetime fields
                        if (formattedValue && parentContent.Fields.TryGetValue(_currPart, out field) &&
                            (field is NumberField || field is DateTimeField))
                        {
                            obj = field.GetFormattedValue();
                        }
                        else
                        {
                            obj = parentContent[_currPart];
                        }
                    }
                    else
                    {
                        obj = parentContent.GetLocalizedValue(_currPart, cultureInfo);
                    }
                }
                catch (Exception e) //logged
                {
                    Logger.WriteException(e);
                    obj = ((GenericContent)parentContent.ContentHandler).GetProperty(currPart);
                }

                #region Check the type of the obj and deal with it and set previousListObj, parentContent and obj accordingly
                if (obj is IList)
                {
                    IList list = obj as IList;
                    obj             = list;
                    previousListObj = list;
                    if (index < list.Count)
                    {
                        obj = list[index];
                        Node node = obj as Node;
                        if (node != null)
                        {
                            parentContent = SNC.Content.Load(node.Id);
                        }
                        else
                        {
                            parentContent = null;
                        }
                    }
                    else
                    {
                        parentContent = null;
                    }
                    continue;
                }
                else if (obj is SenseNet.ContentRepository.Fields.HyperLinkField.HyperlinkData)
                {
                    continue;
                }
                else if (obj is Node)//Not link and not HyperlinkData
                {
                    parentContent = SNC.Content.Load(((Node)obj).Id);
                    continue;
                }
                else // If the object was not of the above then carry it on to the next iteration
                {
                    continue;
                }
                #endregion
            }
            if (obj != null) // No more parts left
            {
                return(obj.ToString());
            }
            else
            {
                return("");
                //throw new Exception(String.Format("{0} could not be resolved at {1}.", name, currPart));
            }
        }