From d31bd8755ed5c35bf8bdce006f6d4c07f8c607f8 Mon Sep 17 00:00:00 2001 From: Joel Mandell Date: Mon, 20 Mar 2023 15:52:36 +0100 Subject: [PATCH] Fixing issue #13865 (i.e. Rich text link picker not resolving correct variant when using .ValueFor()). (#13889) (cherry picked from commit 451d1cec6ab9ea3f1ea269fff3c4e95debfae5e7) --- .../Extensions/PublishedElementExtensions.cs | 23 +++++++++++++++++++ .../IPublishedValueFallback.cs | 5 ++++ .../PublishedValueFallback.cs | 2 ++ 3 files changed, 30 insertions(+) diff --git a/src/Umbraco.Core/Extensions/PublishedElementExtensions.cs b/src/Umbraco.Core/Extensions/PublishedElementExtensions.cs index c85178c85c..440962cd76 100644 --- a/src/Umbraco.Core/Extensions/PublishedElementExtensions.cs +++ b/src/Umbraco.Core/Extensions/PublishedElementExtensions.cs @@ -134,6 +134,27 @@ public static class PublishedElementExtensions #endregion + #region CheckVariation + /// + /// Method to check if VariationContext culture differs from culture parameter, if so it will update the VariationContext for the PublishedValueFallback. + /// + /// The requested PublishedValueFallback. + /// The requested culture. + /// The requested segment. + /// + private static void EventuallyUpdateVariationContext(IPublishedValueFallback publishedValueFallback, string? culture, string? segment) + { + IVariationContextAccessor? variationContextAccessor = publishedValueFallback.VariationContextAccessor; + + //If there is a difference in requested culture and the culture that is set in the VariationContext, it will pick wrong localized content. + //This happens for example using links to localized content in a RichText Editor. + if (!string.IsNullOrEmpty(culture) && variationContextAccessor?.VariationContext?.Culture != culture) + { + variationContextAccessor!.VariationContext = new VariationContext(culture, segment); + } + } + #endregion + #region Value /// @@ -174,6 +195,8 @@ public static class PublishedElementExtensions { IPublishedProperty? property = content.GetProperty(alias); + EventuallyUpdateVariationContext(publishedValueFallback, culture, segment); + // if we have a property, and it has a value, return that value if (property != null && property.HasValue(culture, segment)) { diff --git a/src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs b/src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs index 729f7dd6bc..111d747ec1 100644 --- a/src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs +++ b/src/Umbraco.Core/Models/PublishedContent/IPublishedValueFallback.cs @@ -5,6 +5,11 @@ namespace Umbraco.Cms.Core.Models.PublishedContent; /// public interface IPublishedValueFallback { + /// + /// VariationContextAccessor that is not required to be implemented, therefore throws NotImplementedException as default. + /// + IVariationContextAccessor VariationContextAccessor { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } + /// /// Tries to get a fallback value for a property. /// diff --git a/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs b/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs index 64f0160383..d505c5f2c3 100644 --- a/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs +++ b/src/Umbraco.Core/Models/PublishedContent/PublishedValueFallback.cs @@ -20,6 +20,8 @@ public class PublishedValueFallback : IPublishedValueFallback _variationContextAccessor = variationContextAccessor; } + public IVariationContextAccessor VariationContextAccessor { get { return _variationContextAccessor; } } + /// public bool TryGetValue(IPublishedProperty property, string? culture, string? segment, Fallback fallback, object? defaultValue, out object? value) => TryGetValue(property, culture, segment, fallback, defaultValue, out value);