Multi JCR block

MultiJcrBlockDefinition is a special type of multi field installed by the Content Editor module. It enables different block types in a content editor, for example the Stories app, and allows you to change their appearance.

By specifying the $type as multiJcrBlock, or alternatively the class as info.magnolia.editor.block.jcr.MultiJcrBlockDefinition, several configuration properties are set automatically:

  • implementationClass is set to info.magnolia.editor.block.MultiBlockView

  • entryResolution is set to MultiJcrBlockEntryResolution

  • orderHandler is set to MultiJcrBlockOrderHandler

Example definition

custom:
  label: Blocks
  $type: multiJcrBlock
  initialBlock: text
  defaultBlock: image
  blocks:
    - text
    - image
    - video
    - externalLink
  itemProvider:
    $type: currentItemProvider

Properties

Block-specific properties

Property Description

blocks

required

Node containing a list of block definitions.

defaultBlock

required

The name of the block which will be pre-selected in the block picker subdialog.

initialBlock

required

The name of the block that will be created as the initial block when creating a new content item (new story).

Common multi field properties

  • When configuring the common multi field properties listed in the table below, make sure that you use the JcrMultiFieldDefinition-related variables if more options are present.

  • The field property only applies to field definitions. The corresponding property in a multi block definition is blocks (see in the table above).

Property Description

field

required

Node containing an editor property definition item (typically, a field).

All field types are supported. See List of fields for more information.

JcrMultiLinkFieldDefinition supports only link and combobox fields.

datasource

required (used only in JcrMultiLinkFieldDefinition)

Connects the field to a data source. Options are populated via the configured data source.

Use the fully qualified class name or the $type alias if the definition class is annotated with info.magnolia.ui.datasource.DatasourceType.

chooserId

optional (used only in JcrMultiLinkFieldDefinition), default is ui-framework-jcr:multiChooser

Unique identifier for the multi-chooser dialog. If none is specified, the JCR multiChooser will be used by default.

entryResolution

optional, default is

  • ByMultiValueProperties for JcrMultiValueFieldDefinition

  • MultiFieldEntryResolution for JcrMultiFieldDefinition

  • MultiJcrBlockEntryResolution for MultiJcrBlockDefinition

  • JsonMultiFieldEntryResolver for JsonMultiFieldDefinition

Implementation class that defines how the child entries of a multi field should be resolved.

MultiFieldEntryResolution of JcrMultiFieldDefinition extends ByIndexedChildNodes, which resolves entry nodes regardless of node names. To enable this non-strict resolution behavior, there is a strict property that is set to false by default.

Setting strict to true is necessary in certain compatibility configurations (for example, when porting configurations that use Magnolia 5 UI multi field transformers). In problematic configurations, strict will fall back to the required value and that change will appear in the Definitions app.

orderHandler

optional, default is

  • MultiValuePropertyOrderHandler for JcrMultiValueFieldDefinition

  • DefaultJcrNodeOrderHandler for JcrMultiFieldDefinition

  • MultiJcrBlockOrderHandler for JcrMultiFieldDefinition

Implementation class that sorts nodes and ensures that the suffixes in index names correspond to the order in which they are stored.

canRemoveItems

optional, default is true for JcrMultiValueFieldDefinition and JcrMultiFieldDefinition

When false, the items of a multi field cannot be removed from a dialog.

buttonSelectAddLabel

optional, default is translated buttons.add key (translated dialogs.buttons.select.multiple key for JcrMultiLinkFieldDefinition)

Button label for adding an item. The value is i18n-able.

buttonSelectRemoveLabel

optional, default is translated buttons.delete key

Button label for removing an item. The value is i18n-able.

minItems

optional, default is 0

Specifies the minimum number of items to be added.

maxItems

optional, default is Integer.MAX_VALUE

Specifies the maximum number of items to be added.

If minItems is greater than maxItems, item count validation will be disabled.

itemCountErrorMessage

optional, default is translated validators.multi.itemCount.errorMessage key

Error message shown when the number of items is less than minItems or greater than maxItems. The value can be literal or a key of a message bundle.

required

optional, default is false

Makes the field required. An asterisk is displayed next to the field label.

requiredErrorMessage

optional, default is translated validation.message.required key

Error message shown when required is set to true and the user saves an empty field. The value can be literal or a key of a message bundle.

Common complex field properties

Property Description

name

required

Name of the field definition item. Derived from the configured node name. Use alphanumeric characters without spaces.

class

required (unless $type is used)

Type of the field definition item. The value must be a fully qualified class name and a subtype of info.magnolia.ui.field.FieldDefinition. See Field types for possible values.

$type

You can use this as a shortcut for class if the definition class is annotated with info.magnolia.ui.field.FieldType. The proper value is defined by the annotation.

Example class annotation
@FieldType("textField")
public class TextFieldDefinition extends ConfiguredFieldDefinition<String> {
...
}

See Field types for possible values.

itemProvider

required, default is

  • JcrPropertyProvider for JcrMultiValueFieldDefinition

  • JcrChildNodeProviderDefinition for JcrMultiFieldDefinition

  • CurrentItemProviderDefinition for StaticFieldViewDefinition

Node with a $type property that specifies the type of data binding for the subnodes in complex fields.

See Item providers for more information.

Do not use JcrMultiValueFieldDefinition with any item provider other than the default JcrPropertyProvider.

description

optional

Help text displayed when the user clicks the help icon. The value can be literal or a key of a message bundle.

i18n

optional, default is false

Enables i18n authoring support, which allows editors to write foreign-language or regionally targeted content. A two-letter language identifier (en, de, fr, etc.) is displayed on controls where i18n is set to true.

When defining the property for a multi field, the following configurations are possible:

  • To translate a unique set of entries, set i18n to false for the multi field and to true for its inner fields.

  • To translate different sets of entries, set i18n to true for the multi field and to false for its inner fields (no fallback here between languages).

We do not recommend setting i18n to true on both levels.

label

optional

Field label displayed to editors. The value can be literal or a key of a message bundle.

If you do not provide the property, Magnolia will fall back to a generated i18n key.

If you do not want to have any label, set the property to an empty string such as label: "" in YAML.

styleName

optional

Additional style information for an editor property definition item applied to the element when the form is rendered. The value can be a CSS class or a list of CSS classes separated by white spaces.

The style name will be rendered as an HTML class name, which can be used in a CSS definition. The class name is added to the field by calling the Vaadin method addStyleName.

The referenced class can be defined in:

Content internationalization (i18n)

Internationalization (i18n) of content is not supported in the 1.3.x and 2.0.x versions of the Content Editor module and its Stories app submodule.

The feature will only be enabled in version 2.1. Until it is released for production-ready use, you cen test it out in version 2.1-beta. This version is available on Magnolia Nexus under the following coordinates:

<dependency>
  <groupId>info.magnolia.editor</groupId>
  <artifactId>content-editor-parent</artifactId>
  <version>2.1-beta</version>
</dependency>

Before adding this beta into your webapp, you must remove the bundled version of the module.

Compatibility of content and block definitions

Flat vs nested content structure

The data model for the internationalized Content Editor stories is different in the beta version. Whereas in 1.3.x and 2.0.x the mgnl:block elements are stored in a flat node structure,

stories
└── story1
    ├── 0
    └── 1

in the i18n-supported version, the nodes are locale-nested under intermediate nodes of type mgnl:contentNode, named custom_de and custom in this example:

stories
└── story1
    └── custom_de
    │   ├── 0_de
    │   └── 1_de
    └── custom
        ├── 0
        └── 1

This must be reflected in your MultiJcrBlockDefinition, where you need to add and enable the i18n property.

Instead of the CurrentItemProvider, the CompatibleBlockProvider is set as the default provider, which can resolve both flat and nested block nodes. You do not need to declare it in your block definition.

Example definition
custom:
  label: Blocks
  $type: multiJcrBlock
  i18n: true
  blocks:
    - text
This applies only to the 2.0.x block definitions. Block definitions created for version 1.3.x (5 UI) of the module are not compatible with the 2.1-beta version and must be fully migrated.

Migrating content to 2.1-beta

There are two ways you can migrate the non-i18n blocks to the i18n-compatible hierarchy: using a version handler or a Groovy script.

Version handler

When upgrading the Stories app submodule to version 2.1-beta (or 2.1 once available), all block nodes in the stories workspace will be moved to intermediate nodes, see the MigrateBlockToIntermediateParentTask task.

Groovy script

You can run the migration task in the Groovy app, especially in case a block node is stored in another workspace.

Example Groovy script
import info.magnolia.editor.setup.MigrateBlockToIntermediateParentTask
import info.magnolia.module.InstallContextImpl
import info.magnolia.module.ModuleRegistryImpl
import info.magnolia.objectfactory.Components
import javax.jcr.Session


Session session =  MgnlContext.getJCRSession("stories");
task = new MigrateBlockToIntermediateParentTask("stories", "/", "custom");
task.execute(Components.newInstance(InstallContextImpl.class));
session.save();

The parameters in the MigrateBlockToIntermediateParentTask:

Editing and publishing aspects
Locale selector is disabled

The locale selector combo box is disabled in the following cases:

  • The multiJcrBlock field is configured with i18n: true but the story structure has not been migrated yet.

  • The story complies with the new i18n structure but the multiJcrBlock field is configured with i18n: false.

Publishing stories with multilanguage content

When you publish a story where multilanguage content is enabled and present, the whole story node is published, that is all language variants of the blocks in the story are always published.

Feedback