Skip to content

Commit 7a3862e

Browse files
authored
Support segments from querystring in preview (#17819)
1 parent fe8f81b commit 7a3862e

File tree

10 files changed

+91
-10
lines changed

10 files changed

+91
-10
lines changed

src/Umbraco.Core/Routing/ContentFinderByIdPath.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public Task<bool> TryFindContent(IPublishedRequestBuilder frequest)
9292
}
9393

9494
ResolveAndSetCultureOnRequest(frequest);
95+
ResolveAndSetSegmentOnRequest(frequest);
9596

9697
frequest.SetPublishedContent(node);
9798
if (_logger.IsEnabled(LogLevel.Debug))

src/Umbraco.Core/Routing/ContentFinderByIdentifierPathBase.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ protected void ResolveAndSetCultureOnRequest(IPublishedRequestBuilder frequest)
3232
}
3333
}
3434

35+
protected void ResolveAndSetSegmentOnRequest(IPublishedRequestBuilder frequest)
36+
{
37+
var segmentFromQuerystring = _requestAccessor.GetQueryStringValue("segment");
38+
39+
// Check if we have a segment in the query string
40+
if (!string.IsNullOrEmpty(segmentFromQuerystring))
41+
{
42+
// We're assuming it will match a segment
43+
frequest.SetSegment(segmentFromQuerystring);
44+
}
45+
}
46+
3547
protected Task<bool> LogAndReturnFailure()
3648
{
3749
if (_logger.IsEnabled(LogLevel.Debug))

src/Umbraco.Core/Routing/ContentFinderByKeyPath.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public Task<bool> TryFindContent(IPublishedRequestBuilder frequest)
9090
}
9191

9292
ResolveAndSetCultureOnRequest(frequest);
93+
ResolveAndSetSegmentOnRequest(frequest);
9394

9495
frequest.SetPublishedContent(node);
9596
if (_logger.IsEnabled(LogLevel.Debug))

src/Umbraco.Core/Routing/IPublishedRequest.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public interface IPublishedRequest
6161
/// </remarks>
6262
string? Culture { get; }
6363

64+
/// <summary>
65+
/// Gets the content request's segment (if any).
66+
/// </summary>
67+
string? Segment => null;
68+
6469
/// <summary>
6570
/// Gets the url to redirect to, when the content request triggers a redirect.
6671
/// </summary>

src/Umbraco.Core/Routing/IPublishedRequestBuilder.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ public interface IPublishedRequestBuilder
3232
/// </summary>
3333
string? Culture { get; }
3434

35+
/// <summary>
36+
/// Gets the segment assigned (if any)
37+
/// </summary>
38+
string? Segment => null;
39+
3540
/// <summary>
3641
/// Gets a value indicating whether the current published content has been obtained
3742
/// from the initial published content following internal redirections exclusively.
@@ -72,6 +77,11 @@ public interface IPublishedRequestBuilder
7277
/// </summary>
7378
IPublishedRequestBuilder SetCulture(string? culture);
7479

80+
/// <summary>
81+
/// Sets the segment for the request
82+
/// </summary>
83+
IPublishedRequestBuilder SetSegment(string? segment) => this;
84+
7585
/// <summary>
7686
/// Sets the found <see cref="IPublishedContent" /> for the request
7787
/// </summary>

src/Umbraco.Core/Routing/PublishedRequest.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,39 @@ namespace Umbraco.Cms.Core.Routing;
55

66
public class PublishedRequest : IPublishedRequest
77
{
8+
[Obsolete("Please use the constructor that accepts a segment. Will be removed in V16.")]
9+
public PublishedRequest(
10+
Uri uri,
11+
string absolutePathDecoded,
12+
IPublishedContent? publishedContent,
13+
bool isInternalRedirect,
14+
ITemplate? template,
15+
DomainAndUri? domain,
16+
string? culture,
17+
string? redirectUrl,
18+
int? responseStatusCode,
19+
IReadOnlyList<string>? cacheExtensions,
20+
IReadOnlyDictionary<string, string>? headers,
21+
bool setNoCacheHeader,
22+
bool ignorePublishedContentCollisions)
23+
: this(
24+
uri,
25+
absolutePathDecoded,
26+
publishedContent,
27+
isInternalRedirect,
28+
template,
29+
domain,
30+
culture,
31+
segment: null,
32+
redirectUrl,
33+
responseStatusCode,
34+
cacheExtensions,
35+
headers,
36+
setNoCacheHeader,
37+
ignorePublishedContentCollisions)
38+
{
39+
}
40+
841
/// <summary>
942
/// Initializes a new instance of the <see cref="PublishedRequest" /> class.
1043
/// </summary>
@@ -16,6 +49,7 @@ public PublishedRequest(
1649
ITemplate? template,
1750
DomainAndUri? domain,
1851
string? culture,
52+
string? segment,
1953
string? redirectUrl,
2054
int? responseStatusCode,
2155
IReadOnlyList<string>? cacheExtensions,
@@ -30,6 +64,7 @@ public PublishedRequest(
3064
Template = template;
3165
Domain = domain;
3266
Culture = culture;
67+
Segment = segment;
3368
RedirectUrl = redirectUrl;
3469
ResponseStatusCode = responseStatusCode;
3570
CacheExtensions = cacheExtensions;
@@ -62,6 +97,9 @@ public PublishedRequest(
6297
/// <inheritdoc />
6398
public string? Culture { get; }
6499

100+
/// <inheritdoc />
101+
public string? Segment { get; }
102+
65103
/// <inheritdoc />
66104
public string? RedirectUrl { get; }
67105

src/Umbraco.Core/Routing/PublishedRequestBuilder.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ public PublishedRequestBuilder(Uri uri, IFileService fileService)
3939
/// <inheritdoc />
4040
public string? Culture { get; private set; }
4141

42+
/// <inheritdoc />
43+
public string? Segment { get; private set; }
44+
4245
/// <inheritdoc />
4346
public ITemplate? Template { get; private set; }
4447

@@ -69,6 +72,7 @@ private set
6972
Template,
7073
Domain,
7174
Culture,
75+
Segment,
7276
_redirectUrl,
7377
_responseStatus.HasValue ? (int?)_responseStatus : null,
7478
_cacheExtensions,
@@ -97,6 +101,13 @@ public IPublishedRequestBuilder SetCulture(string? culture)
97101
return this;
98102
}
99103

104+
/// <inheritdoc />
105+
public IPublishedRequestBuilder SetSegment(string? segment)
106+
{
107+
Segment = segment;
108+
return this;
109+
}
110+
100111
/// <inheritdoc />
101112
public IPublishedRequestBuilder SetDomain(DomainAndUri domain)
102113
{

src/Umbraco.Core/Routing/PublishedRouter.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ public async Task<IPublishedRequest> UpdateRequestAsync(
136136
builder.SetDomain(request.Domain);
137137
}
138138
builder.SetCulture(request.Culture);
139+
builder.SetSegment(request.Segment);
139140

140141
// set to the new content (or null if specified)
141142
builder.SetPublishedContent(publishedContent);
@@ -181,7 +182,7 @@ internal IPublishedRequest BuildRequest(IPublishedRequestBuilder builder)
181182
}
182183

183184
// set the culture -- again, 'cos it might have changed in the event handler
184-
SetVariationContext(result.Culture);
185+
SetVariationContext(result.Culture, result.Segment);
185186

186187
return result;
187188
}
@@ -205,15 +206,15 @@ private async Task<IPublishedRequest> TryRouteRequest(IPublishedRequestBuilder r
205206
return request.Build();
206207
}
207208

208-
private void SetVariationContext(string? culture)
209+
private void SetVariationContext(string? culture, string? segment)
209210
{
210211
VariationContext? variationContext = _variationContextAccessor.VariationContext;
211-
if (variationContext != null && variationContext.Culture == culture)
212+
if (variationContext != null && variationContext.Culture == culture && variationContext.Segment == segment)
212213
{
213214
return;
214215
}
215216

216-
_variationContextAccessor.VariationContext = new VariationContext(culture);
217+
_variationContextAccessor.VariationContext = new VariationContext(culture, segment);
217218
}
218219

219220
private async Task RouteRequestInternalAsync(IPublishedRequestBuilder builder, bool skipContentFinders = false)
@@ -226,7 +227,7 @@ private async Task RouteRequestInternalAsync(IPublishedRequestBuilder builder, b
226227
}
227228

228229
// set the culture
229-
SetVariationContext(builder.Culture);
230+
SetVariationContext(builder.Culture, builder.Segment);
230231

231232
var foundContentByFinders = false;
232233

@@ -261,7 +262,7 @@ private async Task RouteRequestInternalAsync(IPublishedRequestBuilder builder, b
261262
HandleWildcardDomains(builder);
262263

263264
// set the culture -- again, 'cos it might have changed due to a finder or wildcard domain
264-
SetVariationContext(builder.Culture);
265+
SetVariationContext(builder.Culture, builder.Segment);
265266
}
266267

267268
// trigger the routing request (used to be called Prepared) event - at that point it is still possible to change about anything
@@ -278,15 +279,15 @@ public bool RouteDomain(IPublishedRequestBuilder request)
278279
{
279280
var found = FindAndSetDomain(request);
280281
HandleWildcardDomains(request);
281-
SetVariationContext(request.Culture);
282+
SetVariationContext(request.Culture, request.Segment);
282283
return found;
283284
}
284285

285286
/// <inheritdoc />
286287
public bool UpdateVariationContext(Uri uri)
287288
{
288289
DomainAndUri? domain = FindDomain(uri, out _);
289-
SetVariationContext(domain?.Culture);
290+
SetVariationContext(domain?.Culture, null);
290291
return domain?.Culture is not null;
291292
}
292293

src/Umbraco.Web.Common/Controllers/RenderController.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ public override async Task OnActionExecutionAsync(ActionExecutingContext context
5858
if (_logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug))
5959
{
6060
_logger.LogDebug(
61-
"Response status: Content={Content}, StatusCode={ResponseStatusCode}, Culture={Culture}",
61+
"Response status: Content={Content}, StatusCode={ResponseStatusCode}, Culture={Culture}, Segment={Segment}",
6262
pcr.PublishedContent?.Id ?? -1,
6363
pcr.ResponseStatusCode,
64-
pcr.Culture);
64+
pcr.Culture,
65+
pcr.Segment);
6566
}
6667

6768
UmbracoRouteResult routeStatus = pcr.GetRouteResult();

src/Umbraco.Web.Common/Templates/TemplateRenderer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public async Task RenderAsync(int pageId, int? altTemplateId, StringWriter write
101101
else
102102
{
103103
requestBuilder.SetCulture(umbracoContext.PublishedRequest.Culture);
104+
requestBuilder.SetSegment(umbracoContext.PublishedRequest.Segment);
104105
}
105106

106107
// set the doc that was found by id

0 commit comments

Comments
 (0)