Configuring form rendering with YAML

Setup

To render a form based on a YAML configuration file, simply use the TYPO3.Form render ViewHelper. It uses the TYPO3\Form\Factory\ArrayFormFactory by default, which needs to know where the form configuration is stored. This is done in Settings.yaml:

TYPO3:
  Form:
    yamlPersistenceManager:
      savePath: 'resource://AcmeCom.SomePackage/Private/Form/'

From now on, every YAML file stored there can be loaded by using the filename as the persistence identifier given to the render ViewHelper. So if you have a file named contact.yaml, it can be rendered with:

<form:render persistenceIdentifier="contact"/>

Form configuration

Generally speaking, the configuration is a nested structure that contains the keys type, identifier and renderables and further options (e.g. label) depending on the type of the current level.

The element types referenced below (TYPO3.Form:SingleLineText and TYPO3.Form:MultiLineText) are just element types which are delivered by default by the framework. All available types can be found in the settings of the TYPO3.Form package under TYPO3.Form.presets.default.formElementTypes.

On the top level, the finishers can be configured as an array of identifier and options keys. The available options depend on the finisher being used.

Let us examine the configuration for a basic contact form with the following structure:

  • Contact Form (Form)
    • Page 01 (Page)
      • Name (Single-line Text)
      • Email (Single-line Text)
      • Message (Multi-line Text)

The following YAML is stored as contact.yaml:

type: 'TYPO3.Form:Form'
identifier: 'contact'
label: 'Contact form'
renderables:
  -
    type: 'TYPO3.Form:Page'
    identifier: 'page-one'
    renderables:
      -
        type: 'TYPO3.Form:SingleLineText'
        identifier: name
        label: 'Name'
        validators:
          - identifier: 'TYPO3.Flow:NotEmpty'
      -
        type: 'TYPO3.Form:SingleLineText'
        identifier: email
        label: 'Email'
        validators:
          - identifier: 'TYPO3.Flow:NotEmpty'
          - identifier: 'TYPO3.Flow:EmailAddress'
      -
        type: 'TYPO3.Form:MultiLineText'
        identifier: message
        label: 'Message'
        validators:
          - identifier: 'TYPO3.Flow:NotEmpty'
finishers:
  -
    identifier: 'TYPO3.Form:Email'
    options:
      templatePathAndFilename: resource://AcmeCom.SomePackage/Private/Templates/Form/Contact.txt
      subject: '{subject}'
      recipientAddress: 'info@acme.com'
      recipientName: 'Acme Customer Care'
      senderAddress: '{email}'
      senderName: '{name}'
      format: plaintext