// tries to get a value, recursing the tree
        private static bool TryGetValueWithRecursiveFallback <T>(IPublishedContent content, string alias, string culture, string segment, T defaultValue, out T value)
        {
            IPublishedProperty property        = null; // if we are here, content's property has no value
            IPublishedProperty noValueProperty = null;

            do
            {
                content  = content.Parent;
                property = content?.GetProperty(alias);
                if (property != null)
                {
                    noValueProperty = property;
                }
            }while (content != null && (property == null || property.HasValue(culture, segment) == false));

            // if we found a content with the property having a value, return that property value
            if (property != null && property.HasValue(culture, segment))
            {
                value = property.Value <T>(culture, segment);
                return(true);
            }

            // if we found a property, even though with no value, return that property value
            // because the converter may want to handle the missing value. ie if defaultValue is default,
            // either specified or by default, the converter may want to substitute something else.
            if (noValueProperty != null)
            {
                value = noValueProperty.Value <T>(culture, segment, defaultValue: defaultValue);
                return(true);
            }

            value = defaultValue;
            return(false);
        }
    public static object?Value(this IPublishedProperty property, IPublishedValueFallback publishedValueFallback, string?culture = null, string?segment = null, Fallback fallback = default, object?defaultValue = default)
    {
        if (property.HasValue(culture, segment))
        {
            return(property.GetValue(culture, segment));
        }

        return(publishedValueFallback.TryGetValue(property, culture, segment, fallback, defaultValue, out var value)
            ? value
            : property.GetValue(culture, segment)); // give converter a chance to return it's own vision of "no value"
    }
Exemple #3
0
        // tries to get a value, falling back onto other languages
        private bool TryGetValueWithLanguageFallback <T>(IPublishedProperty property, string culture, string segment, out T value, bool includeFallbackLanguage)
        {
            value = default;

            if (culture.IsNullOrWhiteSpace())
            {
                return(false);
            }

            var visited = new HashSet <int>();

            var language = _localizationService.GetLanguageByIsoCode(culture);

            if (language == null)
            {
                return(false);
            }

            while (true)
            {
                if (language.FallbackLanguageId == null)
                {
                    return(false);
                }

                var language2Id = language.FallbackLanguageId.Value;
                if (visited.Contains(language2Id))
                {
                    return(false);
                }
                visited.Add(language2Id);

                var language2 = _localizationService.GetLanguageById(language2Id);
                if (language2 == null)
                {
                    return(false);
                }
                var culture2 = language2.IsoCode;

                if (property.HasValue(culture2, segment))
                {
                    value = property.Value <T>(culture2, segment);
                    if (includeFallbackLanguage && culture2 != culture)
                    {
                        value = GetMarkUpForFallbackLanguage(culture2, value);
                    }
                    return(true);
                }

                language = language2;
            }
        }
Exemple #4
0
        public static T Value <T>(this IPublishedProperty property, string culture = null, string segment = null, Fallback fallback = default, T defaultValue = default)
        {
            if (property.HasValue(culture, segment))
            {
                // we have a value
                // try to cast or convert it
                var value = property.GetValue(culture, segment);
                if (value is T valueAsT)
                {
                    return(valueAsT);
                }
                var valueConverted = value.TryConvertTo <T>();
                if (valueConverted)
                {
                    return(valueConverted.Result);
                }

                // cannot cast nor convert the value, nothing we can return but 'defaultValue'
                // note: we don't want to fallback in that case - would make little sense
                return(defaultValue);
            }

            // we don't have a value, try fallback
            if (PublishedValueFallback.TryGetValue(property, culture, segment, fallback, defaultValue, out var fallbackValue))
            {
                return(fallbackValue);
            }

            // we don't have a value - neither direct nor fallback
            // give a chance to the converter to return something (eg empty enumerable)
            var noValue = property.GetValue(culture, segment);

            if (noValue == null)
            {
                return(defaultValue);
            }
            if (noValue is T noValueAsT)
            {
                return(noValueAsT);
            }

            var noValueConverted = noValue.TryConvertTo <T>();

            if (noValueConverted)
            {
                return(noValueConverted.Result);
            }

            // cannot cast noValue nor convert it, nothing we can return but 'defaultValue'
            return(defaultValue);
        }
Exemple #5
0
    // tries to get a value, falling back onto other languages
    private bool TryGetValueWithLanguageFallback <T>(IPublishedProperty property, string?culture, string?segment, out T?value)
    {
        value = default;

        if (culture.IsNullOrWhiteSpace())
        {
            return(false);
        }

        var visited = new HashSet <int>();

        ILanguage?language = culture is not null?_localizationService?.GetLanguageByIsoCode(culture) : null;

        if (language == null)
        {
            return(false);
        }

        while (true)
        {
            if (language.FallbackLanguageId == null)
            {
                return(false);
            }

            var language2Id = language.FallbackLanguageId.Value;
            if (visited.Contains(language2Id))
            {
                return(false);
            }

            visited.Add(language2Id);

            ILanguage?language2 = _localizationService?.GetLanguageById(language2Id);
            if (language2 == null)
            {
                return(false);
            }

            var culture2 = language2.IsoCode;

            if (property.HasValue(culture2, segment))
            {
                value = property.Value <T>(this, culture2, segment);
                return(true);
            }

            language = language2;
        }
    }
Exemple #6
0
        public IPublishedProperty GetProperty(string alias, bool recurse)
        {
            IPublishedProperty property = GetProperty(alias);

            if (recurse == false)
            {
                return(property);
            }

            IPublishedContent content = this;

            while (content != null && (property == null || property.HasValue() == false))
            {
                content  = content.Parent;
                property = content?.GetProperty(alias);
            }

            return(property);
        }
Exemple #7
0
        public static T Value <T>(this IPublishedProperty property, string culture = null, string segment = null, Fallback fallback = default, T defaultValue = default)
        {
            if (property.HasValue(culture, segment))
            {
                // we have a value
                // try to cast or convert it
                var value = property.GetValue(culture, segment);
                if (value is T valueAsT)
                {
                    return(valueAsT);
                }
                var valueConverted = value.TryConvertTo <T>();
                if (valueConverted)
                {
                    return(valueConverted.Result);
                }

                // cannot cast nor convert the value, nothing we can return but 'default'
                // note: we don't want to fallback in that case - would make little sense
                return(default);