Frontend Developer Manual / Version 2207
Table Of ContentsSome settings can be clearly assigned to a specific theme or brick. Some of these settings might even only make sense in the context of a specific theme or if certain bricks are active. These settings would probably need to be changed if a different theme is chosen, for example, for a sub page. Because of this, settings can now also be declared within the frontend workspace.
To be able to achieve this, every brick and theme package can provide one or multiple settings files placed in the
src/settings
folder of the package. Settings are JSON
files which end with
.settings.json
:
MyTheme.settings.json
Preview.settings.json
A typical settings file looks like this:
{ "sliderMetaData": { "cm_responsiveDevices": { "mobile": { "width": 414, "height": 736, "order": 1 }, "tablet": { "width": 768, "height": 1024, "order": 2 } }, "cm_preferredWidth": 1280 }, "fragmentPreview": { "CMPicture": [ { "titleKey": "preview_label_teaser", "viewName": "asTeaser" } ], "CMTeasable": [ { "titleKey": "preview_label_default", "viewName": "DEFAULT" }, { "titleKey": "preview_label_teaser", "viewName": "asTeaser" } ] } }
Example 4.9. Preview.settings.json
Supported Property Types for Settings
A settings file will be imported to the content server when a theme is deployed and is stored in a
CMSettings
document linked to the theme. As the content type uses Structs
settings files
can declare the following types:
{ "my-string-property": "Hello World", "my-string-list-property": ["Hello", "World"] }
Example 4.10. String / String List
{ "my-integer-property": 1, "my-integer-list-property": [0, 9] }
Example 4.11. Integer / Integer List
{ "my-boolean-property": true, "my-boolean-list-property": [true, false, false] }
Example 4.12. Boolean / Boolean List
{ "my-link-property": { "$Link": "../sass/styling.scss" }, "my-link-list-property": [ { "$Link": "../sass/styling.scss" }, { "$Link": "../sass/more-styling.scss" }, ] }
Example 4.13. Link / Link List
{ "my-date-property": "2018-11-13", "my-date-list-property": [ "2018-11-13 20:20:39", "2018-11-13+03:00", "2018-11-13 20:20:39-09:00" ] }
Example 4.14. Date / Date List
{ "my-struct-property": { "hello": "world", "show": true }, "my-struct-list-property": [ { "nestedStruct": { "hello": "world" } }, { "list": [1, 2, 3] } ] }
Example 4.15. Struct / Struct List
As you can see it is basically plain JSON
syntax except for link and date properties (and
their list counterparts). You can describe almost everything that can be expressed via JSON
with
settings files. However, there are the following limitations:
Property names may not contain a colon (":").
Lists cannot have mixed item types. This is because structs are also restricted to this, otherwise the settings could not be imported to the content server.
List may not be empty as otherwise the list type that needs to be declared in the struct cannot be detected.
Links can only point to scripts and styles that are defined in the theme configuration.
If one of the limitations is neglected the theme build will trigger a warning or an error accordingly.
Merging of Settings
During the theme build the settings files of all packages will be aggregated and merged. Merging is performed on filename base, so all settings files of the same name in different packages are merged into a single settings file with that name. If a setting is declared multiple times, the setting that is declared closer to the root of the theme's dependency tree takes precedence. This is the same mechanism as for SCSS variables and templates.
Properties are always overridden except for struct properties. If a struct property is encountered multiple times, the theme build will merge the structs instead of replacing the former ones entirely. This is a deep merge, so nested structs will also be merged.
Caution
While you can have multiple settings files to structure the settings to your needs you need to make sure that if the same top-level property is used multiple times in different packages it is always declared in the same settings file.
Let's assume the example for Preview.settings.json
at the beginning of the chapter is declared
in the preview brick. In case you want to override the fragmentPreview
and
sliderMetaData
in a brick or theme that depends on the preview brick you need to create a
Preview.settings.json
file in the src/settings
folder of your theme.
Settings Lookup
Settings can be looked up in FreeMarker Templates using the bp.setting
method of the
Section 6.5.3, “Blueprint (bp)”. The lookup mechanism for the given key will first check the given
self
, then the context
(for example, the cmpage) and finally the theme. This implies that a theme
setting has the least precedence of all settings definitions and will only be taken into account if it is not
overridden somewhere along the lookup chain.
If you want to use theme settings in other backend modules (for example, content beans) via the
com.coremedia.blueprint.base.settings.SettingsService
you need to make sure that the theme is
actually taken into account when providing beans for the lookup. Please check the
com.coremedia.blueprint.cae.web.taglib.BlueprintFreemarkerFacade
to find code examples on how
to achieve this.