// 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" }
// 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; } }
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); }
// 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; } }
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); }
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);