Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Rename macro 'n' to 'mgnl-n'.

Table of Contents

Introduction

Magnolia 5.1 introduce a new way to handle properties bound to a dialog field. Until Magnolia 5.1 the only way to modify the default behavior (a field is bound to a simple property) was to override the FieldBuilder.getOrCreateProperty(..  method.
Now by configuration we have the possibility to define custom way to read and write a value or values from a property linked to a field. This is us full for complex fields like MultiValueField or CompositeField that needs more than one simple property bound to them.

Basic Concept

A Field  is linked to a Property  used to store the field value. This Property :

...

(warning) Until Magnolia 5.1, the transformation between (2) and (3) was a 1:1 translation, meaning that the individual fields where directly accessing the Item. Now Magnolia 5.1 introduce a new layer between (2) and (3) allowing to perform complexer mapping. This layer is called Transformer.

Assume that we have a new requirement regarding our form example: The Item (2) stay the same, but the form should only display one text field containing the full name (first and last name) . This is now possible by defining a TransformerClass property on the Field Definition: 

 

 

Mockup
Namesimple transformer

In this case, the field builder will create a TransformedProperty as field property datasource. This TransformedProperty delegate to the Transformer the get and set value field calls.

Another good example for illustrating the Transformer behavior is the MultiValueField. The the related field Now for a MultiField, the related Property can no more be a simple Property but rather a ListProperty . This ListProperty will be populated with the individual field Property values.
This is the first information needed in order to handle complex fields: The PropertType (Basic, List, Composite,...)complex property containing several values.  This property is a PropertysetItemt (a Property containing several Property).

Mockup
AlignmentLeft
Namefields 2

The way values of the ListProperty are set and retrieve from the related Item is also something we would like to configure. For example I may want to have a MultiField composed of DateField stored in a single multi value.
The same field may be used in another place but the values have to be stored as sub item (nodes) elements.
PropertyHandler is the second information needed. PropertyHandler handle the way property element are retrieve and set to an Item.

Configuration

previous mockup display a Date multi value field (3). This field is associated to a PropertysetItemt that contains the individual Date Property. This property delegate the read and write to a Transformer (1) This Transformer knows how to read and write the individual  Date Property from and to the related form item. In this example the Transformer is bound to an Item property of type list. This introduce another big advantage of the Transformer's. For the same field it is possible to define several read/write strategy:
Store the field values into a single array, or into sub items, ...

Configuration

This These configurations are done in the common fields Properties.

PropertyDescriptionDefault valueValid values
transformerClass

Concrete implementation of info.magnolia.ui.form.field.transformer.Transformer<T>

propertyBuilder

Concrete property Type and Handler definition. Optional.
If not defined,  BasicProperty and BasicPropertyHandler are info.magnolia.ui.form.field.transformer.basic.BasicTransformer<T> is used.
(warning) ComplexeFieldDefinition may define default property Type and Handler in their constructor.

  
    propertyHandlerImplementation class of  PropertyHandler set to the propertyType used to set and get values in certain format.  
    propertyTypeImplementation class of CustomPropertyType set as Field PropertyDatasource

default Transformer  in their constructor.

  

Default behavior

Basic

...

Field

By default BasicProperty and BasicPropertyHandler are used, basic fields (Textm Date, Checkbox,...) uses BasicTransformer.

The field is created based on the related form ItemBasicPropertyHandler BasicTransformer will:

  • Retrieve the Item.property if this property already exist on the Item.
    property is search based on the Field name defined as name property on the field definition. 
  • Create the Item.property if this property do not yet exist on the Item.
    property is created based on the following field definition:
    • type: property will get the desired type
    • defaultValue: if define, the string representation of the default field value is converted to a new typed value.

Composite

...

Fields

Composite Property (CompositePropertyComposite Transformer (CompositeTransformer SwitchableTransformer) are used by the following fields:

  • CompositeField
  • SwitchableField

CompositeField

This field is use by default bound with  SimplePropertyCompositeHandler . This handler the CompositeTransformer  . This Transformer will store each single field part of the CompositeField as single suffixed property.
Assume that your CompositeField is called 'composite' and contains two fields: a text field called 'simpleText' and a date field called 'simpleDate'. The  values will be stored as following:

Advanced Tables - Table Plus
enableHeadingAttributesfalse
enableSortingfalse
classm5-configuration-tree
enableHighlightingfalse
Node nameValue
mgnl-p
compositesimpleText
some text value
mgnl-p
compositesimpleDate
2006-05-01T21:47:58.230+02:00

 

SwitchableField

This field is used by default bound with  SwitchableSimplePropertyCompositeHandler the SwitchableTransformer. This handler Transformer  will store each single field part of the SwitchableField as single suffixed property.
Assume that your SwitchableField is called 'switchable' and contains two fields: a text field called 'simpleText' and a date field called 'simpleDate'. The  values will be stored as following:

Advanced Tables - Table Plus
enableHeadingAttributesfalse
enableSortingfalse
classm5-configuration-tree
enableHighlightingfalse
Node nameValue
mgnl-p
switchable
text (last tab selected)
mgnl-p
switchablesimpleText
some text value
mgnl-p
switchablesimpleDate
2006-05-01T21:47:58.230+02:00

List Property

Multi-Value Field

Multi-Value Transformer List Property (ListProperty) are used by the following field:

  • MultiField

MultiField

This field is by default bound with  MultiValuesPropertyMultiHandler MultiValueTransformer . This handler This Transformer will store each single field part of the MultiField as a multiValue property (Basically a JCR multiValue property represented a a Typed List property).

i18n

All default Transformer implementation support the i18n definition.
If for example you have two language defined ('en', 'de') with 'en' set as default language:

Advanced Tables - Table Plus
enableHeadingAttributesfalse
enableSortingfalse
classm5-configuration-tree
enableHighlightingfalse
Node nameValue

Mgnl n
formNode

 

   
mgnl-p
simpleText
Simple English Text
   
mgnl-p
simpleText_de
Einfache deutsche Text
   
mgnl-p
multiValueText
English1,English2,English3
   
mgnl-p
multiValueText_de
Deutsche1,Deutsche2

If you want to implement create your own implementation of PropertyHandler Transformer that support i18n, your implementation will need to:

  • return true for PropertyHandler for Transformer.hasI18NSupport() 
  • implement a compatible Magnolia i18n logic.

Default Value

ConfiguredFieldDefinition.defaultValue  contains the String representation of the default value.

The default value is only showed the first time the related form is displayed.

This behavior is only supported by  basic field

Implemented

...

Implemented Property

...

Property

A field needs to be linked to a property as data source. The value of the property is used to store the value entered/selected by the user on the field.
In Magnolia 5.1, every field are bound to a property that support Transformer called TransformedProperty.
This property is initialized with the configured Transformer and set to the field as datasource by the FieldFactory.

 

Mockup
Namedd

 

BaseProperty

BaseProperty implements the following basic mechanism:

  • Handle i18n support.
  • Delegate the configured handler the request  when property.getValue() and property.setValue() are called.

Implemented Handlers

 

BasicPropertyHandler

Overview

Mockup
Namebasic

BasicPropertyHandler

ww

A ConfiguredField is linked to a TransformedProperty<T>

  • TransformedProperty<T>  is initialized with a Transformer.

TransformedProperty<T> extend ObjectProperty<T>.

  • value T : Transformer.readFromItem()
  • T : Transformer.getType()

The Transformer has the responsibility to retrieve the initial value and to set the property class type.

TransformedProperty<T>  may be of any type. For a TextField configured to handle Long (ConfiguredFieldDefinition.type = Long), the <T>  will be of type Long.
For complexer Field (Multi, Composite) the <T> is of type PropertysetItem . This let the complex field easily handle multi property.

Implemented Transformer

BasicTransformer

The property linked to a field is retrieved and stored based on the Field's  property name defined in the field definition.

A new property is created in case id does not yet exist.

...

Advanced Tables - Table Plus
enableHeadingAttributesfalse
enableSortingfalse
classm5-configuration-tree
enableHighlightingfalse
Node nameValue
   
mgnl-p
simpleText
Simple English Text
   
mgnl-p
simpleText_de
Einfache deutsche Text
   
mgnl-p
simpleText_fr
Simple text en francais
OptionGroupPropertyHandler

In case of an OptionGroup field is defined as multiselect, the selected values are stored as a JCR multi-value-property. This JCR multi-value-property is normally handled as a List, but the underlying Vaadin field is only working with Set . This handler simply convert  List to Set

TextCodePropertyHandler

Simple TextCode Handler that return an empty String instead of a null property value.

TwinSelectPropertyHandler

Like for the OptionGroup field, the underlying Vaadin Field need additional convertor between List to Set.

...

CompositeTransformer

In addition to the CompositeField and SwitchableField default Handler Transformer, we provide two an additional CompositeHandlerTransformer:

SubNodeCompositeHandler

 SubNodeCompositeHandler  will store the  property values of the fields composing the composite field under the following format:

...

enableHeadingAttributesfalse
enableSortingfalse
classm5-configuration-tree
enableHighlightingfalse

...

formNode

...

 

...

Second field name composing the
Composite field

...

NoOpCompositeTransformer

NoOpCompositeTransformer

...

Third field name composing the
Composite field

...

(warning) This Handler do not support i18n (in Magnolia 5.1).

NoOpCompositeHandler

NoOpCompositeHandler is useful if you want to combine a Multi filed storing individual field value into sub nodes with composite field as Multi field component.

Mockup
Namen

In this case, the Multi field handler field Transformer will createread/read write the node Item structure and pass a properties as PropertysetItem to the NoOpCompositeHandler NoOpCompositeTransformer. This handler This Transformer just act as a property container. 

MultiTransformer

...

MultiValueTransformer
MultiValuesPropertyMultiHandler

This is the default Handler default Transformer set for Multi value fields. The fields values are stored in a LinkedList<T> . This LinkedList<T> is then automatically convert to a JCR multi-value-property once it is persisted.
(warning) This will only work for simple fields like text/date/radio...

...

MultiValueJSONTransformer

Handler storing Transformer storing the fields values as a String with ',' as separator.
(warning) This will only work for simple fields like text/date/radio... and values are stored as String.

...

MultiValueChildrenNodeTransformer

HandlerTransformer storing the fields values in sub node item property: (Equivalent Jcr Structure of the form Item)

Advanced Tables - Table Plus
enableHeadingAttributesfalse
enableSortingfalse
classm5-configuration-tree
enableHighlightingfalse
Node nameElement nameValue

Mgnl n
formNode

 

 

   
Mgnl n
00
Incremental child node name 
       
mgnl-p
multi
Multi field nameTyped value in the First field
   
Mgnl n
01
Incremental child node name 
       
mgnl-p
multi

Multi field name

 yped Typed value in the Second field
   
Mgnl n
02
Incremental child node name 
       
mgnl-p
multi

Multi field name

Typed value in the Third field
SubNodesMultiPropertysetItemHandler
MultiValueSubChildrenNodePropertiesTransformer

Transformer storing each field values into a sub Item. Equivalent to MultiValueChildrenNodeTransformer but this Transformer is able to handle multiple values.  Based on the previous NoOpCompositeHandlero previous NoOpCompositeTransformer example:

Advanced Tables - Table Plus
enableHeadingAttributesfalse
enableSortingfalse
classm5-configuration-tree
enableHighlightingfalse
Node nameElement nameValue

Mgnl n
formNode

 

 

   
Mgnl n
multi
Multi field name 
       
Mgnl n
00
Incremental child node name 
           
mgnl-p
text

Text field name composing the
Composite field

Typed value in the Text field
           
mgnl-p
date
Date field name composing the
Composite field
Selected date
           
mgnl-p
select
Select field name composing the
Composite field
Selected selection
       
Mgnl n
 01
Incremental child node name 
           
mgnl-p
text

Text field name composing the
Composite field

Typed value in the Text field
           
mgnl-p
date
Date field name composing the
Composite field
Selected date
           
mgnl-p
select
Select field name composing the
Composite field
Selected selection
       
Mgnl n
02
Incremental child node name 
           
mgnl-p
text

Text field name composing the
Composite field

Typed value in the Text field
           
mgnl-p
date
Date field name composing the
Composite field
Selected date
           
mgnl-p
select
Select field name composing the
Composite field
Selected selection

...

MultiValueSubChildrenNodeTransformer

Handler creating Transformer creating first a child node (named as the multi field) and storing the fields values in sub node property (equivalent to MultiValueChildrenNodeTransformer) :

Advanced Tables - Table Plus
enableHeadingAttributesfalse
enableSortingfalse
classm5-configuration-tree
enableHighlightingfalse
Node nameElement nameValue

Mgnl n
formNode

 

 

   
Mgnl n
multi
Multi field name 
       
Mgnl n
038a2c75-2638-48e6-a
Incremental child node name 
           
mgnl-p
multi
Multi field name038a2c75-2638-48e6-a6ba-9bd2a9fe6c78
       
Mgnl n
 72e2ef55-6c11-4b0e-8
Incremental child node name 
           
mgnl-p
multi

Multi field name

 72e2ef55-6c11-4b0e-8e02-d47c4ad41083
       
Mgnl n
11bbf78b-4ecf-4e9f-a
Incremental child node name 
           
mgnl-p
multi

Multi field name

11bbf78b-4ecf-4e9f-a06e-6181ef56d98c

 

 

Limitation

 

How to

 

Open Issue

Default value handling

The field definition allows to define a default value as a String:

  • Text field, type is String default value is 'default value'
  • Text field, type is Long default value is 1000l
  • ....

This default value should be displayed in the related form field if ????

  • It is a new Form
    • (plus) easy to implement
    • (minus) if a field is added to an existing form, this default value will never be displayed.
    • (thumbs up) chooses solution
  • If the property related to a form is null (currently if a property has an empty value, this property is removed or not saved)
    • (plus) easy to implement
    • (minus) if a user remove the default value associated to a field --> no property saved. When he will reopen this form, the default value will be displayed again
  • ??

...