While using a editable template, while using experience fragments, the same brand pointing to a locale, for example /content/experience-fragments/brand-a/en/header, the out of the box experience fragment will be smart enough to route the resource to the correct locale, for example /content/brand-a/fr -> /content/experience-fragments/brand-a/fr/header, /content/brand-a/kr -> /content/experience-fragments/brand-a/kr/header, /content/brand-a/it -> /content/experience-fragments/brand-a/it/header.
In previous projects, I had a similar requirement like yours, we had /content/brand-a, /content/brand-b, /content/brand-c using the exact same editable templates. So how did we determine
- /content/brand-a/ca/en (points to ->) /content/experience-fragments/brand-a/ca/en/header/master
- /content/brand-a/ca/fr (points to ->) /content/experience-fragments/brand-a/ca/en/header/master
- /content/brand-b/ca/en (points to ->) /content/experience-fragments/brand-b/ca/en/header/master
- /content/brand-b/ca/fr (points to ->) /content/experience-fragments/brand-b/ca/fr/en/header/master
- /content/brand-c/ca/en (points to ->) /content/experience-fragments/brand-c/ca/en/en/header/master
- /content/brand-c/ca/fr(points to ->) /content/experience-fragments/brand-c/ca/fr/en/header/master
One Example Quick Solution (Use Context Aware Configuration):
Create an OSGi Configuration Interface > HeaderXFCaConfig.java
@ObjectClassDefinition(name = "Header XF Configuration")
public HeaderXFConfig {
@AttributeDefinition(
name = "Header XF Path",
description = "Path to the Experience Fragment used as the header"
)
String xfHeaderPath();
}
2. Model to Resolve XF Dynamically
@Model(adaptables = { Resource.class }, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class HeaderXFModel {
private Resource resource;
private ConfigurationBuilder configBuilder;
public String getHeaderXFPath() {
HeaderXFConfig config = configBuilder.as(HeaderXFConfig.class);
return config != null ? config.xfHeaderPath() : null;
}
}
3. Include XF Dynamically in custom component
<sly data-sly-use.header="com.example.core.models.HeaderXFModel"
data-sly-resource="${header.headerXFPath @ resourceType='experience-fragment/components/xfpage'}">
</sly>
4. Very Simple Context Aware Solution
- Configure Ca Config for:
- /content/brand-a/ca/en (points to ->) /content/experience-fragments/brand-a/ca/en/header/master
- /content/brand-a/ca/fr (points to ->) /content/experience-fragments/brand-a/ca/en/header/master
- /content/brand-b/ca/en (points to ->) /content/experience-fragments/brand-b/ca/en/header/master
- /content/brand-b/ca/fr (points to ->) /content/experience-fragments/brand-b/ca/fr/en/header/master
- /content/brand-c/ca/en (points to ->) /content/experience-fragments/brand-c/ca/en/en/header/master
- /content/brand-c/ca/fr(points to ->) /content/experience-fragments/brand-c/ca/fr/en/header/master