Configuring form rendering with YAML

Setup

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

Neos:
  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 (Neos.Form:SingleLineText and Neos.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 Neos.Form package under Neos.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: 'Neos.Form:Form'
identifier: 'contact'
label: 'Contact form'
renderables:
  -
    type: 'Neos.Form:Page'
    identifier: 'page-one'
    renderables:
      -
        type: 'Neos.Form:SingleLineText'
        identifier: name
        label: 'Name'
        validators:
          - identifier: 'Neos.Flow:NotEmpty'
      -
        type: 'Neos.Form:SingleLineText'
        identifier: email
        label: 'Email'
        validators:
          - identifier: 'Neos.Flow:NotEmpty'
          - identifier: 'Neos.Flow:EmailAddress'
      -
        type: 'Neos.Form:MultiLineText'
        identifier: message
        label: 'Message'
        validators:
          - identifier: 'Neos.Flow:NotEmpty'
finishers:
  -
    identifier: 'Neos.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

Note

Instead of setting the templatePathAndFilename option to specify the Fluid template file for the EmailFinisher, the template source can also be set directly via the templateSource option.

File Uploads

The default preset comes with an FileUpload form element that allows the user of the form to upload arbitrary files. The EmailFinisher allows these files to be sent as attachments:

type: 'Neos.Form:Form'
identifier: 'application'
label: 'Example application form'
renderables:
  -
    type: 'Neos.Form:Page'
    identifier: 'page-one'
    renderables:
      -
        type: 'Neos.Form:SingleLineText'
        identifier: email
        label: 'Email'
        validators:
          - identifier: 'Neos.Flow:NotEmpty'
          - identifier: 'Neos.Flow:EmailAddress'
      -
        type: 'Neos.Form:FileUpload'
        identifier: applicationform
        label: 'Application Form (PDF)'
        properties:
          allowedExtensions:
            - pdf
        validators:
          - identifier: 'Neos.Flow:NotEmpty'
finishers:
  -
    # Application email that is sent to "customer care" with all uploaded files attached
    identifier: 'Neos.Form:Email'
    options:
      templatePathAndFilename: 'resource://AcmeCom.SomePackage/Private/Form/EmailTemplates/Application.html'
      subject: 'New Application'
      recipientAddress: 'application@acme.com'
      senderAddress: '{email}'
      format: html
      attachAllPersistentResources: true
  -
    # Confirmation email that is sent to the user with a static file attachment
    identifier: 'Neos.Form:Email'
    options:
      templatePathAndFilename: 'resource://AcmeCom.SomePackage/Private/Form/EmailTemplates/Confirmation.html'
      subject: 'Your Application'
      recipientAddress: '{email}'
      senderAddress: 'application@acme.com'
      format: html
      attachments:
        - resource: 'resource://AcmeCom.SomePackage/Private/Form/EmailTemplates/Attachments/TermsAndConditions.pdf'

Note

attachments can also referenced via formElement paths explicitly, for example: - formElement: 'image-field.resource'