Skip to content

Commit a98ea74

Browse files
Merge branch 'umbraco:main' into uc-discount-providers-updates
2 parents 5472b6a + 0269b4e commit a98ea74

File tree

159 files changed

+848
-629
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

159 files changed

+848
-629
lines changed

.github/styles/UmbracoDocs/Acronyms.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ exceptions:
3636
- DELETE # HTTP DELETE method
3737
- DHL # International Shipping brand
3838
- DIBS # DIBS by Nets
39+
- DLL # Dynamic-Link Library
3940
- DNS # Domain Name System
4041
- DOM # Document Object Model
4142
- DXP # Digital Experience Platform

.github/workflows/check-broken-pr-links.yml

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,47 +53,61 @@ jobs:
5353
if: always()
5454
run: |
5555
mkdir -p lychee
56-
: > lychee/comment.md # start with empty file
56+
: > lychee/comment.md # start with an empty file
5757
5858
awk '
5959
/^Errors in / {
6060
file=$3
6161
gsub("^/home/runner/work/UmbracoDocs/UmbracoDocs/", "", file)
62-
print "\nBroken links found in:\n" file >> "lychee/comment.md"
62+
print "\n**Broken links found in: " file "**" >> "lychee/comment.md"
6363
next
6464
}
65-
65+
6666
/\[ERROR\]/ {
6767
msg = $0
6868
sub(/^- \[ \] /, "", msg)
6969
sub(/^\[ERROR\] /, "", msg)
7070
gsub("^file:///home/runner/work/UmbracoDocs/UmbracoDocs/", "", msg)
71-
print "\n⚓ Anchor not found → " msg >> "lychee/comment.md"
71+
gsub(/\|/, "\\|", msg) # escape Markdown pipe
72+
print "\n⚓ Anchor not found → " msg "\n" >> "lychee/comment.md"
7273
next
7374
}
74-
75+
7576
/\[404\]/ {
7677
msg = $0
7778
sub(/^- \[ \] /, "", msg)
7879
sub(/^\[404\] /, "", msg)
79-
print "\n❌ 404 Not Found → " msg >> "lychee/comment.md"
80+
gsub(/\|/, "\\|", msg) # escape pipe
81+
print "\n❌ 404 Not Found → " msg "\n" >> "lychee/comment.md"
8082
next
8183
}
82-
84+
8385
/\[301\]|\[302\]/ {
8486
msg = $0
8587
sub(/^- \[ \] /, "", msg)
8688
sub(/^\[(301|302)\] /, "", msg)
87-
print "\n🔀 Redirect → " msg >> "lychee/comment.md"
89+
gsub(/\|/, "\\|", msg) # escape pipe
90+
print "\n🔀 Redirect → " msg "\n" >> "lychee/comment.md"
8891
next
8992
}
90-
93+
9194
/Timeout/ && !/Timeouts/ {
9295
msg = $0
9396
sub(/^- \[ \] /, "", msg)
94-
print "\n⏳ Timeout → " msg >> "lychee/comment.md"
97+
gsub(/\|/, "\\|", msg) # escape pipe just in case
98+
print "\n⏳ Timeout → " msg "\n" >> "lychee/comment.md"
99+
next
100+
}
101+
102+
# catch-all for any other errors
103+
/^\- \[ \] \[[0-9]+\]/ {
104+
msg = $0
105+
sub(/^- \[ \] /, "", msg)
106+
gsub(/\|/, "|", msg)
107+
print "\n⚠ Unknown error → " msg "\n" >> "lychee/comment.md"
95108
next
96109
}
110+
97111
' lychee/out_raw.md
98112
99113
# Add header only if we found content

.lycheeignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
^https://github\.com/umbraco/Umbraco-CMS/tree/.*
88
^https://github\.com/Shazwazza/Articulate/blob/.*/.*#L.*
99
^https://github\.com/umbraco/Umbraco-CMS/blob/.*
10+
^https://github\.com/.*/issues/[0-9]+#issuecomment-[0-9]+
1011

1112
# Anchor/fragment links causing false positives
1213
^https://apidocs\.umbraco\.com/.*/#.*

13/umbraco-cms/reference/notifications/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ Below you can find a list of the most common ContentService object notifications
5858
* [ContentEmptiedRecycleBinNotification](https://apidocs.umbraco.com/v13/csharp/api/Umbraco.Cms.Core.Notifications.ContentEmptiedRecycleBinNotification.html)
5959
* [ContentSavedBlueprintNotification](https://apidocs.umbraco.com/v13/csharp/api/Umbraco.Cms.Core.Notifications.ContentSavedBlueprintNotification.html)
6060
* [ContentDeletedBlueprintNotification](https://apidocs.umbraco.com/v13/csharp/api/Umbraco.Cms.Core.Notifications.ContentDeletedBlueprintNotification.html)
61+
* [ContentSortedNotification](https://apidocs.umbraco.com/v13/csharp/api/Umbraco.Cms.Core.Notifications.ContentSortedNotification.html)
6162

6263
</details>
6364

13/umbraco-commerce/how-to-guides/customizing-templates.md

Lines changed: 1 addition & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,62 +14,4 @@ Download the custom templates and place them in `/Views/Partials/Commerce/Email/
1414

1515
{% file src="../.gitbook/assets/Umbraco.Commerce.Templates.v13.zip" %}
1616
Umbraco Commerce Custom Templates
17-
{% endfile %}
18-
19-
## Creating Custom Templates
20-
21-
### Email Templates
22-
23-
To Create a Custom Email Template:
24-
25-
1. Create a Razor view file (`.cshtml`) in `/Views/Partials/Commerce/Email/.`
26-
2. Implement the `IEmailTemplate` interface to make the template available in Umbraco Commerce:
27-
28-
```csharp
29-
using Umbraco.Commerce.Core.Interfaces;
30-
31-
public class CustomOrderEmailTemplate : IEmailTemplate
32-
{
33-
public virtual string FileName => "CustomOrderEmail.cshtml";
34-
}
35-
36-
```
37-
38-
3. Register the Template in a Composer:
39-
40-
```csharp
41-
using Umbraco.Cms.Core.Composing;
42-
using Umbraco.Cms.Core.DependencyInjection;
43-
44-
public class CustomTemplateComposer : IComposer
45-
{
46-
public void Compose(IUmbracoBuilder builder)
47-
{
48-
builder.EmailTemplates().Add<CustomOrderEmailTemplate>();
49-
}
50-
}
51-
52-
```
53-
54-
### Print and Export Templates
55-
56-
To create Print/Export Templates:
57-
58-
1. Create a Razor view file (`.cshtml`) under the relevant paths:
59-
60-
```
61-
/Views/Partials/Commerce/Prints/
62-
/Views/Partials/Commerce/Exports/
63-
```
64-
65-
2. Implement the `IPrintTemplate` or `IExportTemplate` interface to make the template available in Umbraco Commerce.
66-
3. Register the template in a Composer similar to the email template process.
67-
68-
## Shipping Custom Templates in a Razor Class Library
69-
70-
To distribute custom templates as part of a Razor Class Library (RCL):
71-
72-
1. Create a new Razor Class Library project.
73-
2. Add the template files under appropriate paths, for example, `Views/Partials/Commerce/Emails/`.
74-
3. Implement interfaces like `IEmailTemplate,` `IPrintTemplate,`or `IExportTemplate` .
75-
4. Use a composer to register your custom templates.
17+
{% endfile %}

13/umbraco-deploy/release-notes.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ If you are upgrading to a new major version you can find the details about the b
1616

1717
This section contains the release notes for Umbraco Deploy 13 including all changes for this version.
1818

19+
### [13.4.1](https://github.com/umbraco/Umbraco.Deploy.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.1) (September 5th 2025)
20+
21+
* Fix parsing root UDI range when custom `tryParseEntityIdFromNodeId` is used when [registering a transfer entity type](./extending/extending.md#backoffice-integrated-transfers)
22+
* Fix updating restore descriptions when the selected workspace is changed
23+
* Set default row span in block area configuration when migrating to Block Grid editor [#270](https://github.com/umbraco/Umbraco.Deploy.Issues/issues/270#issuecomment-3068861453)
24+
1925
### [13.4.0](https://github.com/umbraco/Umbraco.Deploy.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.0) (February 6th 2025)
2026

2127
* All items from 13.4.0-rc1

13/umbraco-forms/developer/rendering-forms.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Six parameters can be provided:
1818

1919
- `formId` is the GUID of a form.
2020
- `theme` is the name of a theme. If not provided, the default theme is used (see [Themes](./themes.md)).
21-
- `includeScripts` indicates whether scripts should be rendered with the form (see [Rendering Scripts](./rendering-scripts.md).
21+
- `includeScripts` indicates whether scripts should be rendered with the form. This is necessary for using conditional fields. See [Rendering Scripts](./rendering-scripts.md) for more details.
2222
- `recordId` is an optional existing record GUID, used if editing records via the website is [enabled in configuration](../developer/configuration/README.md#alloweditableformsubmissions)
2323
- `redirectToPageId` is an optional GUID for a content page that, if provided, is redirected to once the form has been submitted. It will be used in preference to post-submission behavior defined on the form itself.
2424
- `additionalData` is an optional dictionary of string values. When provided it will be used as a source for ["magic string" replacements](./magic-strings.md). The data will be associated with the created record and made available for custom logic or update within workflows.
@@ -71,4 +71,4 @@ Similarly, you can reference a form picker property on your page:
7171
{
7272
@await Umbraco.RenderMacroAsync("renderUmbracoForm", new { FormGuid = formId, FormTheme = Model.FormTheme, ExcludeScripts = "1" })
7373
}
74-
```
74+
```

13/umbraco-forms/developer/working-with-data.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,45 @@ Sample script that is outputting comments using a Form created with the default
110110
}
111111
</ul>
112112
```
113+
114+
115+
## Loading a Record From a Submitted Form
116+
When a form is submitted, the submitted form ID and the saved record ID are stored in the `TempData` so they can be referenced.
117+
118+
You can use the FormService and the RecordStorage to get the `Form` and `Record` objects.
119+
120+
Here is a sample code for retrieving a record in a view.
121+
122+
```
123+
@using Umbraco.Forms.Core.Models
124+
@using Umbraco.Forms.Core.Persistence.Dtos
125+
@using Umbraco.Forms.Core.Data.Storage
126+
@using Umbraco.Forms.Core.Services
127+
@inject IFormService _formService
128+
@inject IRecordStorage _recordStorage
129+
@inherits UmbracoViewPage
130+
@{
131+
Guid formId;
132+
Form? form;
133+
Guid recordId;
134+
Record? record;
135+
string submittedEmail;
136+
137+
if (Guid.TryParse(TempData["UmbracoFormSubmitted"]?.ToString(), out Guid formId) &&
138+
Guid.TryParse(TempData["Forms_Current_Record_id"]?.ToString(), out Guid recordId))
139+
{
140+
141+
form = _formService.Get(formId);
142+
143+
if (form != null && TempData["Forms_Current_Record_id"] != null)
144+
{
145+
Guid.TryParse(TempData["Forms_Current_Record_id"]?.ToString(), out recordId);
146+
147+
record = _recordStorage.GetRecordByUniqueId(recordId, form);
148+
149+
submittedEmail = record.GetRecordFieldByAlias("email")?.ValuesAsString();
150+
}
151+
}
152+
}
153+
```
154+

13/umbraco-workflow/release-notes.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ Check the [Version Specific Upgrade Notes](upgrading/version-specific.md) articl
1717

1818
This section contains the release notes for Umbraco Workflow 13 including all changes for this version.
1919

20-
### 13.4.5 (https://github.com/umbraco/Umbraco.Workflow.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.5) (July 30 2025)
20+
### [13.4.5](https://github.com/umbraco/Umbraco.Workflow.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.5) (July 30 2025)
2121
* Ensures inherited group members are always populated [#111](https://github.com/umbraco/Umbraco.Workflow.Issues/issues/111)
2222
* Adds an option to disable the remote version check [#99](https://github.com/umbraco/Umbraco.Workflow.Issues/issues/99)
2323
* Corrects user attribution when completing a workflow. Previously the resulting publish was attributed to the user who actioned the last task in the workflow. The correct attribution is the user who started the workflow.
2424
* Ensures `DateHelper.getLocalDate` always receives a date string, not a Date object.
2525

26-
### 13.4.4 (https://github.com/umbraco/Umbraco.Workflow.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.4) (July 16 2025)
26+
### [13.4.4](https://github.com/umbraco/Umbraco.Workflow.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.4) (July 16 2025)
2727
* Additional formatting and content improvements in email task summaries [#94](https:/github.com/umbraco/Umbraco.Workflow.Issues/issues/94)
2828

29-
### 13.4.3 (https://github.com/umbraco/Umbraco.Workflow.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.3) (May 29 2025)
29+
### [13.4.3](https://github.com/umbraco/Umbraco.Workflow.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.3) (May 29 2025)
3030
* Improves task summary display in notification emails [#94](https://github.com/umbraco/Umbraco.Workflow.Issues/issues/94)
3131

3232
### 13.4.2 (April 2 2025)
@@ -36,7 +36,7 @@ This section contains the release notes for Umbraco Workflow 13 including all ch
3636
### 13.4.1 (March 20 2025)
3737
* Fixes an intermittent issue where fetching approval groups in a mapper resulted in a scoping error
3838

39-
### 13.4.0 (https://github.com/umbraco/Umbraco.Workflow.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.0) (March 6 2025 )
39+
### [13.4.0](https://github.com/umbraco/Umbraco.Workflow.Issues/issues?q=is%3Aissue+is%3Aclosed+label%3Arelease%2F13.4.0) (March 6 2025 )
4040
* Dependency update for Umbraco.Licenses and Microsoft.Extensions.FileProviders.Abstractions (making this release a minor)
4141
* Fixes pagination in assigned-to task table [#96](https://github.com/umbraco/Umbraco.Workflow.Issues/issues/91)
4242
* Fixes off-by-one bug when calculating approval thresholds with implicit approval [#97](https://github.com/umbraco/Umbraco.Workflow.Issues/issues/97)
Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,61 @@
11
---
2-
description: A guide to multisite setup in Umbraco
2+
description: A guide to setting up a multisite solution in Umbraco
33
---
44

55
# Multisite Setup
66

7-
This tutorial explains how to host multiple sites from one project/installation of Umbraco. For practical reasons, we recommend using [Baselines](https://docs.umbraco.com/umbraco-cloud/getting-started/baselines) on Umbraco Cloud projects.
7+
This tutorial explains how to host multiple sites from one project or installation of Umbraco. For practical reasons, it is recommended to use [Baselines](https://docs.umbraco.com/umbraco-cloud/getting-started/baselines) on Umbraco Cloud projects.
88

99
{% hint style="info" %}
10-
When using Baselines on Umbraco Cloud for a multisite solution, you would not need to worry about [Usage](https://docs.umbraco.com/umbraco-cloud/set-up/project-settings/usage) limits, and could see better performance compared to having multiple websites in one project.
10+
When using Baselines on Umbraco Cloud for a multisite solution, you don’t need to worry about [Usage](https://docs.umbraco.com/umbraco-cloud/set-up/project-settings/usage) limits. You may also see better performance compared to hosting multiple websites in one project.
1111
{% endhint %}
1212

13-
If you are planning to create a multilingual site, please take a look at the [Multilanguage Setup](multilanguage-setup.md) tutorial instead.
13+
To create a multi-language site, see the [Creating a Multilingual Site](multilanguage-setup.md) tutorial.
1414

1515
## Structuring your website
1616

17-
The best way to handle a multisite solution is to have multiple root nodes in the Content section, where each root node would act as a separate website.
17+
The best way to handle a multisite solution is to create multiple root nodes in the Content section. Each root node acts as a separate website.
1818

19-
All the websites in your solution will use the same schema. In most cases, this would mean that your content pages on website A will use the same properties as on website B.
19+
All websites in the solution use the same schema. In most cases, content pages on website A use the same properties as on website B.
2020

2121
{% hint style="info" %}
22-
If your site is hosted on Umbraco Cloud, you will need to map your sites' hostnames to the project.
23-
24-
Before you can map your hostnames to individual websites in the solution, you should add them in the Hostnames page on the Cloud portal to ensure they are secured with TLS.
22+
On Umbraco Cloud, hostnames must be mapped to the project. Before mapping hostnames to individual websites, add them to the **Hostnames** page in the Cloud portal. This ensures they are secure with TLS.
2523
{% endhint %}
2624

27-
![Adding hostnames to the project](../../../10/umbraco-cms/tutorials/images/1-addinghostnames.png)
25+
![Adding hostnames to the project](images/1-addinghostnames.png)
2826

29-
Keep in mind the [hostnames have to be configured in a specific way.](https://docs.umbraco.com/umbraco-cloud/set-up/project-settings/manage-hostnames)
27+
Keep in mind that [hostnames must be configured in a specific way](https://docs.umbraco.com/umbraco-cloud/set-up/project-settings/manage-hostnames).
3028

3129
## Mapping the hostnames to individual websites/root nodes
3230

33-
At this point, you will have multiple root nodes, each acting as a separate website. To map the hostnames to individual root nodes:
31+
At this point, multiple root nodes exist, each acting as a separate website. To map hostnames to root nodes:
3432

3533
1. Go to the **Content** section.
36-
2. Click **...** next to the root node you wish to assign the hostname.
34+
2. Click **...** next to the root node to assign the hostname.
3735
3. Select **Culture and Hostnames**.
3836

3937
![Culture and hostnames](images/culturehostnames-v14.png)
40-
4. In the **Domains** pane, click **Add new Domain**.
41-
5. Enter the domain in the **Domain** field and select the language from the **Language** drop-down list. If you have a multilanguage solution, you can map different hostnames to specific languages.
38+
4. Click **Add new Domain** in the **Domains** section.
39+
5. Enter the domain in the **Domain** field.
40+
6. Select the language from the **Language** drop-down list. For multilanguage setups, different hostnames can map to specific languages.
4241

4342
![Domain](images/inherit-domain.png)
4443

45-
6. Click Save.
46-
7. Repeat steps 2-6 for each root node in the Content structure.
44+
7. Click **Save**.
45+
8. Repeat steps 2-7 for each root node in the Content tree.
46+
47+
The sites are now available under the assigned domains.
4748

48-
The sites are now available under the domains you provided.
49+
![Dolphin Website](images/6-dolphins.png)
4950

50-
![Dolphin site](../../../10/umbraco-cms/tutorials/images/6-dolphins.png) ![SWATO site](../../../10/umbraco-cms/tutorials/images/7-swato.png)
51+
![Swato Website](images/7-swato.png)
5152

5253
## Best practices
5354

54-
While such a setup might be handy, it also comes with drawbacks. It is important to keep in mind that having multiple sites on one Umbraco project:
55+
This setup can be useful, but it also has drawbacks. Keep in mind that having multiple sites in one Umbraco project:
5556

5657
* Might increase resource usage.
57-
* Could interfere with editors' workflows, especially if there are multiple people working on both websites at once. That is because the solution will still use one database for both websites.
58-
* Limit your options in regards to developing new features and making schema changes.
58+
* Could interfere with editors' workflows, especially if multiple people are working on both websites at once. This is because the solution still uses one shared database for both websites.
59+
* Limits options for developing new features and making schema changes.
5960

60-
On Umbraco Cloud-hosted sites we recommend using the [Baseline](https://docs.umbraco.com/umbraco-cloud/getting-started/baselines) functionality - which comes with added benefits, and offers increased stability compared to the multisite solution in a single project.
61+
On Umbraco Cloud, it is recommended to use [Baselines](https://docs.umbraco.com/umbraco-cloud/getting-started/baselines). Baselines provide added benefits and greater stability compared to hosting multiple sites in one project.

0 commit comments

Comments
 (0)