Forms usually are defined by using the Neos.Fusion.Form:Form
prototype
in afx. The form.target
can be passed as a string but since it is
predefined as a Neos.Fusion:UriBuilder
so in most cases only the target
form.target.action
has to be defined. The current package
and
controller
are assumed automatically. By default the form.method
is post
but
other methods can be used aswell.
renderer = afx`
<Neos.Fusion.Form:Form form.target.action="sendOrder" form.target.controller="Order" >
</Neos.Fusion.Form:Form>
`
Since forms are used to manipulate existing data those objects or data structures
are bound the form as form.data
. The fusion forms allow to manipulate multiple
objects at once that are sent to the target controller as separate arguments.
renderer = afx`
<Neos.Fusion.Form:Form form.data.customer={customer} form.data.shipmentAddress={shipmentAddress}>
</Neos.Fusion.Form:Form>
`
The actual input elements, fieldsets and labels are defined as afx content for the form.
renderer = afx`
<Neos.Fusion.Form:Form form.data.customer={customer}>
<fieldset>
<legend for="example">Example</legend>
<input type="text" name="title" />
</fieldset>
</Neos.Fusion.Form:Form>
`
While html inputs can be used they provide no magic like data-binding and automatic namespaces.
To render controls that access the data bound to the form prototypes like
Neos.Fusion.Form:Input
are used. Those prototypes are derived from
Neos.Fusion.Form:Component.Field
which is responsible for establishing
the relation between form and field.
There are plenty of different fieldTypes already that can be found in the Neos.Neos.Form Fusion Documentation but it is also easily possible to create new input types for project-specific purposes.
renderer = afx`
<Neos.Fusion.Form:Form form.data.customer={customer}>
<Neos.Fusion.Form:Input field.name="customer[firstName]" />
<Neos.Fusion.Form:Input field.name="customer[lastName]" />
<Neos.Fusion.Form:Button >Submit</Neos.Fusion.Form:Button>
</Neos.Fusion.Form:Form>
`
It is possible to create field components with translated label and error
rendering. The prototype Neos.Fusion.Form:Neos.BackendModule.FieldContainer
is an example for that which implements the required markup for Neos backend modules.
Labels are added and translated using the translations from Neos.Neos:Main
and validation errors are translated using the source Neos.Flow:ValidationErrors
as translation source.
renderer = afx`
<Neos.Fusion.Form:Form form.data.customer={customer}>
<Neos.Fusion.Form:FieldContainer field.name="customer[firstName]">
<Neos.Fusion.Form:Input />
</Neos.Fusion.Form:FieldContainer>
<Neos.Fusion.Form:Button >Submit</Neos.Fusion.Form:Button>
</Neos.Fusion.Form:Form>
`