# Implementing custom Form Fields The most obvious extension point is the definition of custom fieldtypes. To do so you have to extend the `Neos.Fusion.Form:Component.Field` prototype and implement the renderer you need. For the rendering the `field` value in the fusion context provides access to informations like `field.name` and `field.currentValue` based on the data bound to the form or the previously submitted values. HINT: By default all field components support setting `attributes` which are expected to override all automatically assigned attributes and whenever it makes sense also `content` which is usually defined via afx. ``` prototypeVendor.Site:Form.Textarea) < prototype(Neos.Fusion.Form:Component.Field) { renderer = afx` ` } ``` ### Implementing a custom DatetimeLocal field This example shows a datetime-local field that implements a custom stringification for DateTime and integer values. ``` prototype(Vendor.Site:Form.DatetimeLocal) < prototype(Neos.Fusion.Form:Component.Field) { # # Since we want to calculate the value via fusion but also want to avoid # making value an api a wrapper component is used # renderer = Neos.Fusion:Component { # the `field` provides the name name = ${field.getName()} # # the value is fetched from the `field` with fallback to target value # value = ${field.getCurrentValue() || field.getTargetValue()} # # the value might be an object so we have to process it to a string for html # value.@process.formatDatime = Neos.Fusion:Case { isDateTime { condition = ${(Type.getType(value) == 'object') && Type.instance(value , '\DateTime') } renderer = ${Date.format(value, 'Y-m-d\TH:i')} } isInteger { condition = ${(Type.getType(value) == 'integer')} renderer = ${Date.format(Date.create('@' + value), 'Y-m-d\TH:i')} } default { condition = true renderer = ${field.getCurrentValueStringified() || field.getTargetValueStringified()} } } # # attributes are passed down # attributes = ${props.attributes} # # the actual markup # renderer = afx` ` } } ```