Multi JCR block
info.magnolia.editor.block.jcr.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.
Keep in mind that multiJcrBlock is a content-editor field and therefore can’t be used in a content-type app.
|
By specifying the
|
Example definition
blocks:
label: Blocks
$type: multiJcrBlock
initialBlock: text
defaultBlock: image
blocks:
- text
- image
- video
- externalLink
itemProvider:
$type: currentItemProvider
Properties
Block-specific properties
Property | Description |
---|---|
|
required Node containing a list of block definitions. |
|
required The name of the block which will be pre-selected in the block picker subdialog. |
|
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
|
Property | Description | ||
---|---|---|---|
|
required Node containing an editor property definition item (typically, a field). All field types are supported. See List of fields for more information. |
||
|
required Connects the field to a data source. Options are populated via the configured data source. Use the fully qualified class name or the |
||
|
optional (used only in Unique identifier for the multi-chooser
dialog. If none is specified, the
JCR
|
||
|
optional, default is
Implementation class that defines how the child entries of a multi field should be resolved.
|
||
|
optional, default is
Implementation class that sorts nodes and ensures that the suffixes in index names correspond to the order in which they are stored. When |
||
|
optional, default is When |
||
|
optional, default is translated Button label for adding an item. The value is i18n-able. |
||
|
optional, default is translated Button label for removing an item. The value is i18n-able. |
||
|
optional, default is Specifies the minimum number of items to be added. |
||
|
optional, default is Specifies the maximum number of items to be added.
|
||
|
optional, default is translated Error message shown when the number of items is less than
|
||
|
optional, default is Makes the field required. An asterisk is displayed next to the field label. |
||
|
optional, default is translated Error message shown when |
Common complex field properties
Property | Description | ||
---|---|---|---|
|
required Name of the field definition item. Derived from the configured node name. Use alphanumeric characters without spaces. |
||
|
required (unless Type of the field definition item. The value must be a fully qualified
class name and a subtype of |
||
|
You can use this as a shortcut for Example class annotation
See Field types for possible values. |
||
|
required, default is
Node with a See Item providers for more information.
|
||
|
optional Help text displayed when the user clicks the help icon. The value can be literal or a key of a message bundle. |
||
|
optional, default is Enables i18n
authoring support, which allows editors to write foreign-language or
regionally targeted content. A two-letter language identifier ( |
||
|
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 |
||
|
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
|
Content internationalization (i18n)
Internationalization (i18n) of content is supported since version 2.1
of the Content Editor module. Block definitions and data structures created in the older versions of the module must be migrated.
Compatibility of content and block definitions
Flat vs nested content structure
The data model has changed for internationalized stories. Whereas in versions 1.3.x
and 2.0.x
of the module, the mgnl:block
elements are stored in a flat node structure,
stories └── story1 ├── 0 └── 1
in the i18n-supported version (2.1
and higher), the nodes are locale-nested under intermediate nodes of type mgnl:contentNode
, named blocks_de
and blocks
in this example:
stories └── story1 └── blocks_de │ ├── 0_de │ └── 1_de └── blocks ├── 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
-
blocks: 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 version and must be fully migrated.
|
Migrating content
There are two ways you can migrate the non-i18n blocks to the i18n-compatible hierarchy: using a version handler or a Groovy script.
We strongly recommend you have the latest version of the Content Editor before migrating your content. In versions prior to 2.1.3, the |
Version handler
When upgrading the Stories app submodule to version 2.1
or higher, 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", "/", "blocks");
task.execute(Components.newInstance(InstallContextImpl.class));
session.save();
The parameters in the MigrateBlockToIntermediateParentTask
:
-
stories
- workspace name -
/
- path -
blocks
- name of the intermediate node, the name of themultiJcrBlock
field.