blob: 130455b8297e545b45c46ac08e9eba32e221cdfd [file]
== Usage
The plugin provides a set of tags you can use to render the fields in a form.
In the simplest case you can use `f:all` to render a field for every property of a bean (the domain object or command the form will bind to):
[source,groovy]
----
<g:form…>
<f:all bean="person"/>
</g:form>
----
To render individual fields you use the `f:field` tag:
[source,groovy]
----
<g:form…>
<f:field bean="person" property="name"/>
<f:field bean="person" property="address"/>
<f:field bean="person" property="dateOfBirth"/>
</g:form>
----
The `f:field` tag will automatically handle embedded domain properties recursively:
[source,groovy]
----
<f:field bean="person" property="address"/>
----
If there is no bean object backing a form but you still want to render the surrounding field markup you can give `f:field` a body:
[source,groovy]
----
<f:field property="password">
<g:password name="password"/>
</f:field>
----
It should be an unusual case but to render just the widget without its surrounding container you can use the `f:widget` tag:
[source,groovy]
----
<f:widget bean="person" property="name"/>
----
To make it more convenient when rendering lots of properties of the same `bean` you can use the `f:with` tag to avoid having to specify `bean` on any tags nested inside:
[source,groovy]
----
<g:form…>
<f:with bean="person">
<f:field property="name"/>
<f:field property="address"/>
<f:field property="dateOfBirth"/>
</f:with>
</g:form>
----
If you need to render a property for display purposes you can use `f:display`. It will internally use `g:fieldValue`, `g:formatBoolean` or `g:formatDate` to format the value.
[source,groovy]
----
<f:display bean="person" property="name"/>
----
If you need to render the value in a different way you can give `f:display` a body instead.
[source,groovy]
----
<f:display bean="person" property="dateOfBirth">
<g:formatDate format="dd MMM yyyy" date="${value}"/>
</f:display>
----
By default `f:display` simply renders the property value but if you supply a `\_display.gsp` template you can render the value in some structured markup, e.g. a table cell or list item. See the <<customizingFieldRendering,Customizing Field Rendering>> section for how to override templates. For example to render values in a definition list you could use a template like this:
[source,groovy]
----
<dt>${label}</dt>
<dd>${value}</dd>
----
=== Extra attributes (Since version 2.1.4)
You can pass any number of extra attributes to the `f:with` and `f:all` tags that will be propagated to the inner fields and displays.
See their individual tags sections for more information.
=== Breaking changes
=== Templates
The names of the templates were changed for more adequate ones:
* `_field` to `_wrapper`
* `_input` to `_widget`
* `_display` to `_displayWrapper`
* `_displayWidget` was added
To use the old names (for backwards compatibility), configure the following in `Config.groovy`
[source,groovy]
----
grails.plugin.fields.wrapper = "field"
grails.plugin.fields.displayWrapper = "display"
grails.plugin.fields.widget = "input"
----
=== Widget attributes
To pass additional attributes to widgets, prefix them with 'widget-'.
Example:
[source,groovy]
----
<f:field property="birthDate" widget-format="dd/MM/yyyy"/>
----
To use the old prefix (for backwards compatibility), configure the following in `Config.groovy`:
[source,groovy]
----
grails.plugin.fields.widgetPrefix = "input-"
----
=== Changes in tags
* The `f:input` tag was deprecated because the name was confusing. Use the new `f:widget` tag instead.
* The `f:displayWidget` tag was added. It outputs the widget for display purposes, without the wrapper (similar to the `widget` tag).
=== Localized numbers
All numbers are now rendered localized. This means that when using `Locale.ENGLISH` the number 1000.50 is represented
as `1,000.50` but with `Locale.GERMAN` is represented as `1.000,50`. To use the old behavior (for backwards compatibility)
without localizing the numbers, configure the following in `Config.groovy`:
[source,groovy]
----
grails.plugin.fields.localizeNumbers = false
----