[TASK] Document validators of form framework 54/60554/8
authorBjörn Jacob <bjoern.jacob@tritum.de>
Thu, 25 Apr 2019 19:09:03 +0000 (21:09 +0200)
committerRalf Zimmermann <ralf.zimmermann@tritum.de>
Sat, 27 Apr 2019 10:23:13 +0000 (12:23 +0200)
Furthermore, move some documentation around
regarding finishers and validators to have
the information at one central place.

In addition, fix a PHP comment regarding the
MimeType validator.

Resolves: #88212
Releases: master, 9.5
Change-Id: Ifa437294c05d3f9dba16f8bb17ac88a43796595b
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/60554
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Susanne Moog <look@susi.dev>
Tested-by: Ralf Zimmermann <ralf.zimmermann@tritum.de>
Reviewed-by: Susanne Moog <look@susi.dev>
Reviewed-by: Ralf Zimmermann <ralf.zimmermann@tritum.de>
31 files changed:
typo3/sysext/form/Classes/Mvc/Validation/MimeTypeValidator.php
typo3/sysext/form/Documentation/I/ApiReference/Index.rst
typo3/sysext/form/Documentation/I/Concepts/Finishers/Index.rst
typo3/sysext/form/Documentation/I/Concepts/FormEditor/Index.rst
typo3/sysext/form/Documentation/I/Concepts/FrontendRendering/Index.rst
typo3/sysext/form/Documentation/I/Concepts/Index.rst
typo3/sysext/form/Documentation/I/Concepts/Validators/Index.rst [new file with mode: 0644]
typo3/sysext/form/Documentation/I/Config/proto/finishersDefinition/Index.rst
typo3/sysext/form/Documentation/I/Config/proto/finishersDefinition/finishers/Closure.rst
typo3/sysext/form/Documentation/I/Config/proto/finishersDefinition/finishers/Confirmation.rst
typo3/sysext/form/Documentation/I/Config/proto/finishersDefinition/finishers/DeleteUploads.rst
typo3/sysext/form/Documentation/I/Config/proto/finishersDefinition/finishers/EmailToReceiver.rst
typo3/sysext/form/Documentation/I/Config/proto/finishersDefinition/finishers/EmailToSender.rst
typo3/sysext/form/Documentation/I/Config/proto/finishersDefinition/finishers/FlashMessage.rst
typo3/sysext/form/Documentation/I/Config/proto/finishersDefinition/finishers/Redirect.rst
typo3/sysext/form/Documentation/I/Config/proto/finishersDefinition/finishers/SaveToDatabase.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/Index.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/Alphanumeric.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/Count.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/DateTime.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/EmailAddress.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/FileSize.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/Float.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/Integer.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/NotEmpty.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/Number.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/NumberRange.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/RegularExpression.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/StringLength.rst
typo3/sysext/form/Documentation/I/Config/proto/validatorsDefinition/validators/Text.rst
typo3/sysext/form/Documentation/I/FAQ/Index.rst

index c5a749a..0e38d9e 100644 (file)
@@ -35,8 +35,8 @@ class MimeTypeValidator extends AbstractValidator
     ];
 
     /**
-     * The given $value is valid if it is an FileReference of the
-     * configured type (one of the image/* IANA media subtypes)
+     * The given $value is valid if it is a FileReference of the
+     * configured type (one of the IANA media types)
      *
      * Note: a value of NULL or empty string ('') is considered valid
      *
index 48d89c7..ffc0b0a 100644 (file)
@@ -1141,7 +1141,7 @@ Signature::
 parseOption()
 '''''''''''''
 
-Please read :ref:`Accessing finisher options<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions>`
+Please read :ref:`Accessing finisher options<concepts-finishers-customfinisherimplementations-accessingoptions>`
 
 Signature::
 
@@ -1218,7 +1218,7 @@ Signature::
 TYPO3\\CMS\\Form\\Domain\\Finishers\\FinisherVariableProvider
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
-Please read :ref:`Share data between finishers<concepts-frontendrendering-codecomponents-customfinisherimplementations-finishercontext-sharedatabetweenfinishers>`
+Please read :ref:`Share data between finishers<concepts-finishers-customfinisherimplementations-finishercontext-sharedatabetweenfinishers>`
 
 .. _apireference-frontendrendering-programmatically-apimethods-finishervariableprovider-add:
 
@@ -2830,7 +2830,7 @@ databaseColumnMappings.<databaseColumnName>.value
 
 :aspect:`Description`
       The value which will be written to the database column.
-      You can also use the :ref:`FormRuntime accessor feature<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>` to access every getable property from the ``FormRuntime``
+      You can also use the :ref:`FormRuntime accessor feature<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>` to access every getable property from the ``FormRuntime``
       In short: use something like ``{<formElementIdentifier>}`` to get the value from the submitted form element with the identifier ``<formElementIdentifier>``.
 
       If you use the FormRuntime accessor feature within ``options.databaseColumnMappings``, the functionality is nearly identical
index ccbd899..fa8bac8 100644 (file)
@@ -72,6 +72,7 @@ Additional link parameters can be added to the URL.
    This finisher stops the execution of all subsequent finishers in order to perform a redirect.
    Therefore, this finisher should always be the last finisher to be executed.
 
+
 .. _concepts-finishers-savetodatabasefinisher:
 
 SaveToDatabase finisher
@@ -80,11 +81,361 @@ SaveToDatabase finisher
 The 'SaveToDatabase finisher' saves the data of a submitted form into a
 database table.
 
-.. _concepts-finishers-writecustomfinisher:
+
+.. _concepts-finishers-translation:
+
+Translation of finisher options
+-------------------------------
+
+To learn more about this topic, please continue :ref:`here<concepts-frontendrendering-translation-finishers>`.
+
+
+.. _concepts-finishers-customfinisherimplementations:
 
 Write a custom finisher
 -----------------------
 
-:ref:`Learn how to create a custom finisher here.<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+If you want to make the finisher configurable in the backend UI read :ref:`here<concepts-finishers-customfinisherimplementations-extend-gui>`.
+
+Finishers are defined as part of a ``prototype`` within a
+``finishersDefinition``. The property ``implementationClassName`` is to be
+utilized to load the finisher implementation.
+
+.. code-block:: yaml
+
+   TYPO3:
+     CMS:
+       Form:
+         prototypes:
+           standard:
+             finishersDefinition:
+               CustomFinisher:
+                 implementationClassName: 'VENDOR\MySitePackage\Domain\Finishers\CustomFinisher'
+
+If the finisher requires options, you can define those within the
+``options`` property. The options will be used as default values and can
+be overridden using the ``form definition``.
+
+Define the default value:
+
+.. code-block:: yaml
+
+   TYPO3:
+     CMS:
+       Form:
+         prototypes:
+           standard:
+             finishersDefinition:
+               CustomFinisher:
+                 implementationClassName: 'VENDOR\MySitePackage\Domain\Finishers\CustomFinisher'
+                 options:
+                   yourCustomOption: 'Ralf'
+
+Override the option using the ``form definition``:
+
+.. code-block:: yaml
+
+   identifier: sample-form
+   label: 'Simple Contact Form'
+   prototype: standard
+   type: Form
+
+   finishers:
+     -
+       identifier: CustomFinisher
+       options:
+         yourCustomOption: 'Björn'
+
+   renderables:
+     ...
+
+Each finisher has to be programmed to the interface ``TYPO3\CMS\Form\Domain\Finishers\FinisherInterface``
+and should extend the class ``TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher``.
+In doing so, the logic of the finisher should start with the method
+``executeInternal()``.
+
+
+.. _concepts-finishers-customfinisherimplementations-accessingoptions:
+
+Accessing finisher options
+""""""""""""""""""""""""""
+
+If your finisher extends ``TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher``,
+you can access your finisher options with the help of the ``parseOption()``
+method::
+
+   $yourCustomOption = $this->parseOption('yourCustomOption');
+
+``parseOption()`` is looking for 'yourCustomOption' in your
+``form definition``. If it cannot be found, the method checks
+
+1. the ``prototype`` configuration for a default value,
+
+2. the finisher class itself by searching for a default value within the
+   ``$defaultOptions`` property::
+
+      declare(strict_types = 1);
+      namespace VENDOR\MySitePackage\Domain\Finishers;
+
+      class CustomFinisher extends \TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher
+      {
+
+          protected $defaultOptions = [
+              'yourCustomOption' => 'Olli',
+          ];
+
+          // ...
+      }
+
+If the option cannot be found by processing this fallback chain, ``null`` is
+returned.
+
+If the option is found, the process checks whether the option value will
+access :ref:`FormRuntime values<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`.
+If the ``FormRuntime`` returns a positive result, it is checked whether the
+option value :ref:`can access values of preceding finishers<concepts-finishers-customfinisherimplementations-finishercontext-sharedatabetweenfinishers>`.
+At the very end, it tries to :ref:`translate the finisher options<concepts-frontendrendering-translation-finishers>`.
+
+
+.. _concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor:
+
+Accessing form runtime values
+'''''''''''''''''''''''''''''
+
+By utilizing a specific notation, finisher options can be populated with
+submitted form values (assuming you are using the ``parseOption()`` method).
+You can access values of the ``FormRuntime`` and thus values of each single
+form element by encapsulating the option values with ``{}``. If there is a
+form element with the ``identifier`` 'subject', you can access its value
+within the the finisher configuration. Check out the following example to
+get the whole idea.
+
+.. code-block:: yaml
+
+   identifier: simple-contact-form
+   label: 'Simple Contact Form'
+   prototype: standard
+   type: Form
+
+   finishers:
+     -
+       identifier: Custom
+       options:
+         yourCustomOption: '{subject}'
+
+   renderables:
+     -
+       identifier: subject
+       label: 'Subject'
+       type: Text
+
+::
+
+   // $yourCustomOption contains the value of the form element with the
+   // identifier 'subject'
+   $yourCustomOption = $this->parseOption('yourCustomOption');
+
+In addition, you can use ``{__currentTimestamp}`` as a special option value.
+It will return the current UNIX timestamp.
+
+
+.. _concepts-finishers-customfinisherimplementations-finishercontext:
+
+Finisher Context
+""""""""""""""""
+
+The class ``TYPO3\CMS\Form\Domain\Finishers\FinisherContext`` takes care of
+transferring a finisher context to each finisher. Given the finisher is
+derived from ``TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher`` the
+finisher context will be available via::
+
+   $this->finisherContext
+
+The method ``cancel`` prevents the execution of successive finishers::
+
+   $this->finisherContext->cancel();
+
+The method ``getFormValues`` returns all of the submitted form values.
+
+``getFormValues``::
+
+   $this->finisherContext->getFormValues();
+
+The method ``getFormRuntime`` returns the ``FormRuntime``::
+
+   $this->finisherContext->getFormRuntime();
+
+
+.. _concepts-finishers-customfinisherimplementations-finishercontext-sharedatabetweenfinishers:
+
+Share data between finishers
+''''''''''''''''''''''''''''
+
+The method ``getFinisherVariableProvider`` returns an object (``TYPO3\CMS\Form\Domain\Finishers\FinisherVariableProvider``)
+which allows you to store data and transfer it to other finishers. The data
+can be easily accessed programmatically or within your configuration::
+
+   $this->finisherContext->getFinisherVariableProvider();
+
+The data is stored within the ``FinisherVariableProvider`` and is addressed
+by a user-defined 'finisher identifier' and a custom option value path. The
+name of the 'finisher identifier' should consist of the name of the finisher
+without the potential 'Finisher' appendix. If your finisher is derived from
+the class ``TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher``, the name of
+this construct is stored in the following variable::
+
+   $this->shortFinisherIdentifier
+
+For example, if the name of your finisher class is 'CustomFinisher', the
+mentioned variable will contain the value 'Custom'.
+
+There are a bunch of methods to access and manage the finisher data:
+
+- Add data::
+
+      $this->finisherContext->getFinisherVariableProvider()->add(
+          $this->shortFinisherIdentifier,
+          'unique.value.identifier',
+          $value
+      );
+
+- Get data::
+
+      $this->finisherContext->getFinisherVariableProvider()->get(
+          $this->shortFinisherIdentifier,
+          'unique.value.identifier',
+          'default value'
+      );
+
+- Check the existence of data::
 
-If you want to make the finisher configurable in the backend UI read :ref:`here<concepts-formeditor-extending-custom-finisher>`.
+      $this->finisherContext->getFinisherVariableProvider()->exists(
+          $this->shortFinisherIdentifier,
+          'unique.value.identifier'
+      );
+
+- Delete data::
+
+      $this->finisherContext->getFinisherVariableProvider()->remove(
+          $this->shortFinisherIdentifier,
+          'unique.value.identifier'
+      );
+
+In this way, each finisher can access data programmatically. Moreover, it is
+possible to retrieve the data via configuration, provided that a finisher
+stores the values within the ``FinisherVariableProvider``.
+
+Assuming that a finisher called 'Custom' sets data as follows::
+
+   $this->finisherContext->getFinisherVariableProvider()->add(
+       $this->shortFinisherIdentifier,
+       'unique.value.identifier',
+       'Wouter'
+   );
+
+... you are now able to access the value 'Wouter' via ``{Custom.unique.value.identifier}``
+in any other finisher.
+
+.. code-block:: yaml
+
+   identifier: sample-form
+   label: 'Simple Contact Form'
+   prototype: standard
+   type: Form
+
+   finishers:
+     -
+       identifier: Custom
+       options:
+         yourCustomOption: 'Frans'
+
+     -
+       identifier: SomeOtherStuff
+       options:
+         someOtherCustomOption: '{Custom.unique.value.identifier}'
+
+
+.. _concepts-finishers-customfinisherimplementations-extend-gui:
+
+Add finisher to backend UI
+''''''''''''''''''''''''''
+
+After adding a custom finisher you can also add the finisher to the
+form editor GUI to let your backend users configure it visually. Add the
+following to the backend yaml setup:
+
+.. code-block:: yaml
+
+   TYPO3:
+      CMS:
+       Form:
+         prototypes:
+           standard:
+             formElementsDefinition:
+               Form:
+                 formEditor:
+                   editors:
+                     900:
+                       # Extend finisher drop down
+                       selectOptions:
+                         35:
+                           value: 'CustomFinisher'
+                           label: 'Custom Finisher'
+                   propertyCollections:
+                     finishers:
+                        # add finisher fields
+                        25:
+                           identifier: 'CustomFinisher'
+                           editors:
+                              __inheritances:
+                                 10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
+                              100:
+                                label: "Custom Finisher"
+                              # custom field (input, required)
+                              110:
+                                identifier: 'customField'
+                                templateName: 'Inspector-TextEditor'
+                                label: 'Custom Field'
+                                propertyPath: 'options.customField'
+                                propertyValidators:
+                                  10: 'NotEmpty'
+                              # email field
+                              120:
+                                identifier: 'email'
+                                templateName: 'Inspector-TextEditor'
+                                label: 'Subscribers email'
+                                propertyPath: 'options.email'
+                                enableFormelementSelectionButton: true
+                                propertyValidators:
+                                  10: 'NotEmpty'
+                                  20: 'FormElementIdentifierWithinCurlyBracesInclusive'
+
+                finishersDefinition:
+                  CustomFinisher:
+                    formEditor:
+                      iconIdentifier: 'form-finisher'
+                      label: 'Custom Finisher'
+                      predefinedDefaults:
+                        options:
+                          customField: ''
+                          email: ''
+                    # displayed when overriding finisher settings
+                    FormEngine:
+                      label: 'Custom Finisher'
+                      elements:
+                        customField:
+                          label: 'Custom Field'
+                          config:
+                            type: 'text'
+                        email:
+                          label: 'Subscribers email'
+                          config:
+                            type: 'text'
+
+Make sure the setup file is registered in the backend:
+
+.. code-block:: typoscript
+
+   module.tx_form.settings.yamlConfigurations {
+      123456789 = EXT:yourExtension/Configuration/Form/Backend.yml
+   }
index b3ba4fe..e8eeef6 100644 (file)
@@ -545,88 +545,5 @@ displayed in the example above.
 Examples for extending the editor
 ---------------------------------
 
-
-.. _concepts-formeditor-extending-custom-finisher:
-
-Adding inspector options for a custom finisher
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-After adding a custom finisher as described :ref:`here <concepts-frontendrendering-codecomponents-customfinisherimplementations>`
-you can also add the finisher to the form editor GUI to let your backend users configure it visually. Add the following
-to the backend yaml setup:
-
-.. code-block:: yaml
-
-   TYPO3:
-      CMS:
-       Form:
-         prototypes:
-           standard:
-             formElementsDefinition:
-               Form:
-                 formEditor:
-                   editors:
-                     900:
-                       # Extend finisher drop down
-                       selectOptions:
-                         35:
-                           value: 'CustomFinisher'
-                           label: 'Custom Finisher'
-                   propertyCollections:
-                     finishers:
-                        # add finisher fields
-                        25:
-                           identifier: 'CustomFinisher'
-                           editors:
-                              __inheritances:
-                                 10: 'TYPO3.CMS.Form.mixins.formElementMixins.BaseCollectionEditorsMixin'
-                              100:
-                                label: "Custom Finisher"
-                              # custom field (input, required)
-                              110:
-                                identifier: 'customField'
-                                templateName: 'Inspector-TextEditor'
-                                label: 'Custom Field'
-                                propertyPath: 'options.customField'
-                                propertyValidators:
-                                  10: 'NotEmpty'
-                              # email field
-                              120:
-                                identifier: 'email'
-                                templateName: 'Inspector-TextEditor'
-                                label: 'Subscribers email'
-                                propertyPath: 'options.email'
-                                enableFormelementSelectionButton: true
-                                propertyValidators:
-                                  10: 'NotEmpty'
-                                  20: 'FormElementIdentifierWithinCurlyBracesInclusive'
-
-                finishersDefinition:
-                  CustomFinisher:
-                    formEditor:
-                      iconIdentifier: 'form-finisher'
-                      label: 'Custom Finisher'
-                      predefinedDefaults:
-                        options:
-                          customField: ''
-                          email: ''
-                    # displayed when overriding finisher settings
-                    FormEngine:
-                      label: 'Custom Finisher'
-                      elements:
-                        customField:
-                          label: 'Custom Field'
-                          config:
-                            type: 'text'
-                        email:
-                          label: 'Subscribers email'
-                          config:
-                            type: 'text'
-
-Make sure the setup file is registered in the backend:
-
-.. code-block:: typoscript
-
-   module.tx_form.settings.yamlConfigurations {
-      123456789 = EXT:yourExtension/Configuration/Form/Backend.yml
-   }
+Learn :ref:`here <concepts-finishers-customfinisherimplementations-extend-gui>`
+how to make the finisher configurable in the backend UI.
index 5984b86..d980b04 100644 (file)
@@ -267,338 +267,6 @@ interface ``TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface``.
 It is a good idea to derive your implementation from ``TYPO3\CMS\Form\Domain\Model\FormElements\AbstractFormElement``.
 
 
-.. _concepts-frontendrendering-codecomponents-customfinisherimplementations:
-
-Custom finisher implementations
--------------------------------
-
-Finishers are defined as part of a ``prototype`` within a
-``finishersDefinition``. The property ``implementationClassName`` is to be
-utilized to load the finisher implementation.
-
-.. code-block:: yaml
-
-   TYPO3:
-     CMS:
-       Form:
-         prototypes:
-           standard:
-             finishersDefinition:
-               CustomFinisher:
-                 implementationClassName: 'VENDOR\MySitePackage\Domain\Finishers\CustomFinisher'
-
-If the finisher requires options, you can define those within the
-``options`` property. The options will be used as default values and can
-be overridden using the ``form definition``.
-
-Define the default value:
-
-.. code-block:: yaml
-
-   TYPO3:
-     CMS:
-       Form:
-         prototypes:
-           standard:
-             finishersDefinition:
-               CustomFinisher:
-                 implementationClassName: 'VENDOR\MySitePackage\Domain\Finishers\CustomFinisher'
-                 options:
-                   yourCustomOption: 'Ralf'
-
-Override the option using the ``form definition``:
-
-.. code-block:: yaml
-
-   identifier: sample-form
-   label: 'Simple Contact Form'
-   prototype: standard
-   type: Form
-
-   finishers:
-     -
-       identifier: CustomFinisher
-       options:
-         yourCustomOption: 'Björn'
-
-   renderables:
-     ...
-
-Each finisher has to be programmed to the interface ``TYPO3\CMS\Form\Domain\Finishers\FinisherInterface``
-and should extend the class ``TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher``.
-In doing so, the logic of the finisher should start with the method
-``executeInternal()``.
-
-
-.. _concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions:
-
-Accessing finisher options
-""""""""""""""""""""""""""
-
-If your finisher extends ``TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher``,
-you can access your finisher options with the help of the ``parseOption()``
-method::
-
-   $yourCustomOption = $this->parseOption('yourCustomOption');
-
-``parseOption()`` is looking for 'yourCustomOption' in your
-``form definition``. If it cannot be found, the method checks
-
-1. the ``prototype`` configuration for a default value,
-
-2. the finisher class itself by searching for a default value within the
-   ``$defaultOptions`` property::
-
-      declare(strict_types = 1);
-      namespace VENDOR\MySitePackage\Domain\Finishers;
-
-      class CustomFinisher extends \TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher
-      {
-
-          protected $defaultOptions = [
-              'yourCustomOption' => 'Olli',
-          ];
-
-          // ...
-      }
-
-If the option cannot be found by processing this fallback chain, ``null`` is
-returned.
-
-If the option is found, the process checks whether the option value will
-access :ref:`FormRuntime values<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`.
-If the ``FormRuntime`` returns a positive result, it is checked whether the
-option value :ref:`can access values of preceding finishers<concepts-frontendrendering-codecomponents-customfinisherimplementations-finishercontext-sharedatabetweenfinishers>`.
-At the very end, it tries to :ref:`translate the finisher options<concepts-frontendrendering-translation-finishers>`.
-
-
-.. _concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor:
-
-Accessing form runtime values
-'''''''''''''''''''''''''''''
-
-By utilizing a specific notation, finisher options can be populated with
-submitted form values (assuming you are using the ``parseOption()`` method).
-You can access values of the ``FormRuntime`` and thus values of each single
-form element by encapsulating the option values with ``{}``. If there is a
-form element with the ``identifier`` 'subject', you can access its value
-within the the finisher configuration. Check out the following example to
-get the whole idea.
-
-.. code-block:: yaml
-
-   identifier: simple-contact-form
-   label: 'Simple Contact Form'
-   prototype: standard
-   type: Form
-
-   finishers:
-     -
-       identifier: Custom
-       options:
-         yourCustomOption: '{subject}'
-
-   renderables:
-     -
-       identifier: subject
-       label: 'Subject'
-       type: Text
-
-::
-
-   // $yourCustomOption contains the value of the form element with the
-   // identifier 'subject'
-   $yourCustomOption = $this->parseOption('yourCustomOption');
-
-In addition, you can use ``{__currentTimestamp}`` as a special option value.
-It will return the current UNIX timestamp.
-
-
-.. _concepts-frontendrendering-codecomponents-customfinisherimplementations-finishercontext:
-
-Finisher Context
-""""""""""""""""
-
-The class ``TYPO3\CMS\Form\Domain\Finishers\FinisherContext`` takes care of
-transferring a finisher context to each finisher. Given the finisher is
-derived from ``TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher`` the
-finisher context will be available via::
-
-   $this->finisherContext
-
-The method ``cancel`` prevents the execution of successive finishers::
-
-   $this->finisherContext->cancel();
-
-The method ``getFormValues`` returns all of the submitted form values.
-
-``getFormValues``::
-
-   $this->finisherContext->getFormValues();
-
-The method ``getFormRuntime`` returns the ``FormRuntime``::
-
-   $this->finisherContext->getFormRuntime();
-
-
-.. _concepts-frontendrendering-codecomponents-customfinisherimplementations-finishercontext-sharedatabetweenfinishers:
-
-Share data between finishers
-''''''''''''''''''''''''''''
-
-The method ``getFinisherVariableProvider`` returns an object (``TYPO3\CMS\Form\Domain\Finishers\FinisherVariableProvider``)
-which allows you to store data and transfer it to other finishers. The data
-can be easily accessed programmatically or within your configuration::
-
-   $this->finisherContext->getFinisherVariableProvider();
-
-The data is stored within the ``FinisherVariableProvider`` and is addressed
-by a user-defined 'finisher identifier' and a custom option value path. The
-name of the 'finisher identifier' should consist of the name of the finisher
-without the potential 'Finisher' appendix. If your finisher is derived from
-the class ``TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher``, the name of
-this construct is stored in the following variable::
-
-   $this->shortFinisherIdentifier
-
-For example, if the name of your finisher class is 'CustomFinisher', the
-mentioned variable will contain the value 'Custom'.
-
-There are a bunch of methods to access and manage the finisher data:
-
-- Add data::
-
-      $this->finisherContext->getFinisherVariableProvider()->add(
-          $this->shortFinisherIdentifier,
-          'unique.value.identifier',
-          $value
-      );
-
-- Get data::
-
-      $this->finisherContext->getFinisherVariableProvider()->get(
-          $this->shortFinisherIdentifier,
-          'unique.value.identifier',
-          'default value'
-      );
-
-- Check the existence of data::
-
-      $this->finisherContext->getFinisherVariableProvider()->exists(
-          $this->shortFinisherIdentifier,
-          'unique.value.identifier'
-      );
-
-- Delete data::
-
-      $this->finisherContext->getFinisherVariableProvider()->remove(
-          $this->shortFinisherIdentifier,
-          'unique.value.identifier'
-      );
-
-In this way, each finisher can access data programmatically. Moreover, it is
-possible to retrieve the data via configuration, provided that a finisher
-stores the values within the ``FinisherVariableProvider``.
-
-Assuming that a finisher called 'Custom' sets data as follows::
-
-   $this->finisherContext->getFinisherVariableProvider()->add(
-       $this->shortFinisherIdentifier,
-       'unique.value.identifier',
-       'Wouter'
-   );
-
-... you are now able to access the value 'Wouter' via ``{Custom.unique.value.identifier}``
-in any other finisher.
-
-.. code-block:: yaml
-
-   identifier: sample-form
-   label: 'Simple Contact Form'
-   prototype: standard
-   type: Form
-
-   finishers:
-     -
-       identifier: Custom
-       options:
-         yourCustomOption: 'Frans'
-
-     -
-       identifier: SomeOtherStuff
-       options:
-         someOtherCustomOption: '{Custom.unique.value.identifier}'
-
-Add finisher to backend UI
-''''''''''''''''''''''''''
-
-If you want to make the finisher configurable in the backend UI
-read :ref:`here<concepts-formeditor-extending-custom-finisher>`.
-
-
-.. _concepts-frontendrendering-codecomponents-customvalidatorimplementations:
-
-Custom validator implementations
---------------------------------
-
-Validators belong to a certain ``prototype`` and are defined within the
-``validatorsDefinition``. The property ``implementationClassName`` is used
-for the validator implementation.
-
-.. code-block:: yaml
-
-   TYPO3:
-     CMS:
-       Form:
-         prototypes:
-           standard:
-             validatorsDefinition:
-               Custom:
-                 implementationClassName: 'VENDOR\MySitePackage\Domain\Validation\CustomValidator'
-
-You can provide options for your validator using the property ``options``.
-Those will be used as default values which can be overridden within a
-specific ``form definition``.
-
-Define the default value of the option ``yourCustomOption``:
-
-.. code-block:: yaml
-
-   TYPO3:
-     CMS:
-       Form:
-         prototypes:
-           standard:
-             validatorsDefinition:
-               Custom:
-                 implementationClassName: 'VENDOR\MySitePackage\Domain\Validation\CustomValidator'
-                 options:
-                   yourCustomOption: 'Jurian'
-
-Override the default value within your ``form definition``:
-
-.. code-block:: yaml
-
-   identifier: sample-form
-   label: 'Simple Contact Form'
-   prototype: standard
-   type: Form
-
-   renderables:
-     -
-       identifier: subject
-       label: 'Name'
-       type: Text
-       validators:
-         -
-           identifier: Custom
-           options:
-             yourCustomOption: 'Mathias'
-
-EXT:form implements Extbase validators. That said, your own validators should
-extend ``TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator``.
-
-
 .. _concepts-frontendrendering-renderviewHelper:
 
 "render" viewHelper
index 0025943..e5f4cfb 100644 (file)
@@ -18,6 +18,7 @@ chapters also cover topics for developers.
    FormConfigurationFormDefinition/Index
    FormFileStorages/Index
    FrontendRendering/Index
+   Validators/Index
    Finishers/Index
    FormManager/Index
    FormEditor/Index
diff --git a/typo3/sysext/form/Documentation/I/Concepts/Validators/Index.rst b/typo3/sysext/form/Documentation/I/Concepts/Validators/Index.rst
new file mode 100644 (file)
index 0000000..9e61d28
--- /dev/null
@@ -0,0 +1,291 @@
+.. include:: ../../../Includes.txt
+
+
+.. _concepts-validators:
+
+Validators
+==========
+
+The form framework ships a set of server-side validators, which implement
+Extbase validators. Be aware that not all of the existing validators are
+available for each form element, e.g. the "Date range validator" is
+only available for the "Date" element. Furthermore, some form elements
+(like "Email") already contain reasonable validators.
+
+With the help of the form element property ``validationErrorMessages``
+you can define custom validation error messages. The message can also
+be set within the form editor.
+
+
+.. _concepts-validators-client-side-validation:
+
+Client-side validation
+----------------------
+
+If a form element is configured accordingly, the form framework adds
+HTML 5 based frontend validation. Nevertheless, there is no JavaScript
+validation included by default. We as the TYPO3 core have no plans to
+opt for a specific solution. This has to be integrated manually.
+Reliable and maintained projects are `Parsley <https://github.com/guillaumepotier/Parsley.js>`_
+and `jQuery Validation <https://github.com/jquery-validation/jquery-validation>`_.
+
+
+.. _concepts-validators-localization-client-side-validations:
+
+Localization of client side validations
+"""""""""""""""""""""""""""""""""""""""
+
+The displayed validation message is a browser specific text. The output
+is not generated by TYPO3 and therefore you cannot change it easily.
+Nevertheless, there is a JavaScript solution for changing the validation
+message. See `Stack Overflow <http://stackoverflow.com/questions/5272433/html5-form-required-attribute-set-custom-validation-message>`_
+for more information.
+
+
+.. _concepts-validators-server-side-validation:
+
+Server-side validation
+----------------------
+
+
+.. _concepts-validators-alphanumeric:
+
+Alphanumeric validator
+""""""""""""""""""""""
+
+The 'Alphanumeric validator' checks for alphanumeric strings.
+Alphanumeric is defined as a combination of alphabetic and numeric
+characters [A-Z + 0-9].
+
+
+.. _concepts-validators-date_time:
+
+Date/ time validator
+""""""""""""""""""""
+
+The 'Date/ time validator' checks if the given value is a valid DateTime
+object. The date string is expected to be formatted according to the `W3C
+standard <http://www.w3.org/TR/NOTE-datetime.html>`_ which is
+"YYYY-MM-DDT##:##:##+##:##", for example "2005-08-15T15:52:01+00:00".
+
+
+.. _concepts-validators-date_range:
+
+Date range validator
+""""""""""""""""""""
+
+The 'Date range validator' checks if the given value is a valid DateTime
+object and in-between a specified date range. The range can be defined by
+providing a minimum and/ or maximum date. The validator has 2 options:
+
+- Minimum date: The minimum date.
+- Maximum date: The maximum date.
+
+The date string for the above mentioned fields is expected to be formatted
+according to the `W3C standard <http://www.w3.org/TR/NOTE-datetime.html>`_
+which is "YYYY-MM-DDT##:##:##+##:##", for example "2005-08-15T15:52:01+00:00".
+
+
+.. _concepts-validators-email:
+
+Email validator
+"""""""""""""""
+
+The 'Email validator' checks if the given value is a valid email address.
+The format of a valid email address is defined in `RFC 3696 <http://tools.ietf.org/html/rfc3696>`_.
+The standard allows international characters and the multiple appearance
+of the @ sign.
+
+
+.. _concepts-validators-empty:
+
+Empty validator
+"""""""""""""""
+
+The 'Empty validator' checks if the given value is not empty (NULL,
+empty string, empty array or empty object).
+
+
+.. _concepts-validators-filesize:
+
+File size validator
+"""""""""""""""""""
+
+The 'File size validator' validates a file resource regarding its file
+size. The validator has 2 options:
+
+- Minimum: The minimum file size to accept.
+- Maximum: The maximum file size to accept.
+
+Use the format <size>B|K|M|G when entering file sizes. For example: 10M
+means 10 megabytes. Please keep in mind that the maximum file size also
+depends on the php.ini settings of your environment.
+
+
+.. _concepts-validators-floating_point:
+
+Floating-point number validator
+"""""""""""""""""""""""""""""""
+
+The 'Floating-point number validator' checks if the given value is of
+type float or a string matching the regular expression [0-9.e+-].
+
+
+.. _concepts-validators-integer:
+
+Integer number validator
+""""""""""""""""""""""""
+
+The 'Integer number validator' checks if the given value is a valid
+integer.
+
+
+.. _concepts-validators-text:
+
+Non-XML text validator
+""""""""""""""""""""""
+
+The 'Non-XML text validator' checks if the given value is a valid text
+(contains no XML tags). This basically means, that tags are stripped.
+In this special case quotes are not encoded (see `filter_var()
+<http://php.net/filter_var>`_ for more information.
+
+Be aware that the value of this check entirely depends on the output
+context. The validated text is not expected to be secure in every
+circumstance, if you want to be sure of that, use a customized regular
+expression or filter on output.
+
+
+.. _concepts-validators-count:
+
+Number of submitted values validator
+""""""""""""""""""""""""""""""""""""
+
+The 'Number of submitted values validator' checks if the given value
+contains the specified amount of elements. The validator has 2 options:
+
+- Minimum: The minimum number of submitted values.
+- Maximum: The maximum number of submitted values.
+
+
+.. _concepts-validators-number_range:
+
+Number range validator
+""""""""""""""""""""""
+
+The 'Number range validator' checks if the given value is a number in
+the specified range. The validator has 2 options:
+
+- Minimum: The minimum value to accept.
+- Maximum: The maximum vlaue to accept.
+
+
+.. _concepts-validators-mimetype:
+
+MimeType validator
+""""""""""""""""""
+
+The 'MimeType validator' checks if the given value is a FileReference
+of the configured type (one of the */* IANA media types).
+
+
+.. _concepts-validators-string_length:
+
+String length validator
+"""""""""""""""""""""""
+
+The 'String length validator' checks if the given value is a valid string
+and its length is in the specified range. The validator has 2 options:
+
+- Minimum: The minimum length of the string.
+- Maximum: The maximum length of the string.
+
+
+.. _concepts-validators-regular_expressions:
+
+Regular expression validator
+""""""""""""""""""""""""""""
+
+The 'Regular expression validator' checks if the given value matches
+the specified regular expression. Delimiters or modifiers are not
+supported. The validator has 1 option:
+
+- Regular expression: The regular expression to use for validation.
+
+Imagine the following example. You want the user to provide a domain
+name. The submitted value shall only contain the second and the top
+level domain, e.g. "typo3.org" instead of "https://typo3.org". The
+regular expression for this use case would be
+:code:`/^[-a-z0-9]+\.[a-z]{2,6}$/`.
+
+
+.. _concepts-validators-validation-message-translation:
+
+Translation of validation messages
+----------------------------------
+
+To learn more about this topic, please continue :ref:`here<concepts-frontendrendering-translation-validationerrors>`.
+
+
+.. _concepts-validators-customvalidatorimplementations:
+
+Custom validator implementations
+--------------------------------
+
+Validators belong to a certain ``prototype`` and are defined within the
+``validatorsDefinition``. The property ``implementationClassName`` is used
+for the validator implementation.
+
+.. code-block:: yaml
+
+   TYPO3:
+     CMS:
+       Form:
+         prototypes:
+           standard:
+             validatorsDefinition:
+               Custom:
+                 implementationClassName: 'VENDOR\MySitePackage\Domain\Validation\CustomValidator'
+
+You can provide options for your validator using the property ``options``.
+Those will be used as default values which can be overridden within a
+specific ``form definition``.
+
+Define the default value of the option ``yourCustomOption``:
+
+.. code-block:: yaml
+
+   TYPO3:
+     CMS:
+       Form:
+         prototypes:
+           standard:
+             validatorsDefinition:
+               Custom:
+                 implementationClassName: 'VENDOR\MySitePackage\Domain\Validation\CustomValidator'
+                 options:
+                   yourCustomOption: 'Jurian'
+
+Override the default value within your ``form definition``:
+
+.. code-block:: yaml
+
+   identifier: sample-form
+   label: 'Simple Contact Form'
+   prototype: standard
+   type: Form
+
+   renderables:
+     -
+       identifier: subject
+       label: 'Name'
+       type: Text
+       validators:
+         -
+           identifier: Custom
+           options:
+             yourCustomOption: 'Mathias'
+
+As mentioned above EXT:form implements Extbase validators. That said,
+your own validators should extend ``TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator``.
+Read more about this topic in the `Extbase docs <https://docs.typo3.org/typo3cms/ExtbaseFluidBook/9-CrosscuttingConcerns/2-validating-domain-objects.html>`_.
index efd3915..b26e5b9 100644 (file)
@@ -41,7 +41,7 @@ Properties
                [...]
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       Array which defines the available finishers. Every key within this array is called the ``<finisherIdentifier>``.
@@ -95,7 +95,7 @@ Properties
       - :ref:`"[FinishersEditor] selectOptions.[*].value"<typo3.cms.form.prototypes.\<prototypeidentifier>.formelementsdefinition.\<formelementtypeidentifier>.formeditor.editors.*.selectoptions.*.value-finisherseditor>`
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       This array key identifies a finisher. This identifier could be used to attach a finisher to a form.
@@ -128,7 +128,7 @@ implementationClassName
       Depends (see :ref:`concrete finishers configuration <typo3.cms.form.prototypes.\<prototypeidentifier>.finishersdefinition.\<finisheridentifier>-concreteconfigurations>`)
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       .. include:: properties/implementationClassName.rst
@@ -155,7 +155,7 @@ options
       Depends (see :ref:`concrete finishers configuration <typo3.cms.form.prototypes.\<prototypeidentifier>.finishersdefinition.\<finisheridentifier>-concreteconfigurations>`)
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       Array with finisher options.
index 56dc82a..5209e4b 100644 (file)
@@ -40,7 +40,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Form\Domain\Finishers\ClosureFinisher
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
@@ -69,7 +69,7 @@ options.closure
 .. :aspect:`Good to know`
       ToDo
       - :ref:`"Closure finisher"<apireference-finisheroptions-closurefinisher>`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       The closure which are invoked if the finisher is treggered.
index ae4e1f2..b27f93a 100644 (file)
@@ -39,7 +39,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Form\Domain\Finishers\ConfirmationFinisher
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
@@ -67,7 +67,7 @@ options.message
 
 :aspect:`Good to know`
       - :ref:`"Confirmation finisher"<apireference-finisheroptions-confirmationfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
@@ -223,7 +223,7 @@ options.translation.translationFile
 
 :aspect:`Good to know`
       - :ref:`"Confirmation finisher"<apireference-finisheroptions-confirmationfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
index c956cbe..e3609f2 100644 (file)
@@ -39,7 +39,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Form\Domain\Finishers\DeleteUploadsFinisher
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       Array which defines the available finishers. Every key within this array is called the ``<finisherIdentifier>``
index 4f6e244..a08f3c8 100644 (file)
@@ -39,7 +39,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Form\Domain\Finishers\EmailFinisher
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
@@ -67,7 +67,7 @@ options.subject
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
@@ -96,7 +96,7 @@ options.recipientAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of the recipient (To).
@@ -124,7 +124,7 @@ options.recipientName
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Human-readable name of the recipient.
@@ -152,7 +152,7 @@ options.senderAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of the sender/ visitor (From).
@@ -180,7 +180,7 @@ options.senderName
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Human-readable name of the sender.
@@ -208,7 +208,7 @@ options.replyToAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of to be used as reply-to email (use multiple addresses with an array).
@@ -240,7 +240,7 @@ options.carbonCopyAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of the copy recipient (use multiple addresses with an array)
@@ -272,7 +272,7 @@ options.blindCarbonCopyAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of the blind copy recipient (use multiple addresses with an array)
@@ -307,7 +307,7 @@ options.format
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       The format of the email. By default mails are sent as HTML.
@@ -335,7 +335,7 @@ options.attachUploads
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       If set, all uploaded items are attached to the email.
@@ -363,7 +363,7 @@ options.translation.language
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
@@ -394,7 +394,7 @@ options.translation.translationFile
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
index 67c99c4..3f40050 100644 (file)
@@ -39,7 +39,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Form\Domain\Finishers\EmailFinisher
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
@@ -67,7 +67,7 @@ options.subject
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
@@ -96,7 +96,7 @@ options.recipientAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of the recipient (To).
@@ -124,7 +124,7 @@ options.recipientName
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Human-readable name of the recipient.
@@ -152,7 +152,7 @@ options.senderAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of the sender/ visitor (From).
@@ -180,7 +180,7 @@ options.senderName
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Human-readable name of the sender.
@@ -208,7 +208,7 @@ options.replyToAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of to be used as reply-to email (use multiple addresses with an array).
@@ -240,7 +240,7 @@ options.carbonCopyAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of the copy recipient (use multiple addresses with an array)
@@ -272,7 +272,7 @@ options.blindCarbonCopyAddress
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Email address of the blind copy recipient (use multiple addresses with an array)
@@ -307,7 +307,7 @@ options.format
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       The format of the email. By default mails are sent as HTML.
@@ -335,7 +335,7 @@ options.attachUploads
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       If set, all uploaded items are attached to the email.
@@ -363,7 +363,7 @@ options.translation.language
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
@@ -394,7 +394,7 @@ options.translation.translationFile
 
 :aspect:`Good to know`
       - :ref:`"Email finisher"<apireference-finisheroptions-emailfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
index 4fdcf21..f14f556 100644 (file)
@@ -39,7 +39,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Form\Domain\Finishers\FlashMessageFinisher
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
@@ -67,7 +67,7 @@ options.messageBody
 
 :aspect:`Good to know`
       - :ref:`"FlashMessage finisher"<apireference-finisheroptions-flashmessagefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
@@ -96,7 +96,7 @@ options.messageTitle
 
 :aspect:`Good to know`
       - :ref:`"FlashMessage finisher"<apireference-finisheroptions-flashmessagefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
@@ -125,7 +125,7 @@ options.messageArguments
 
 :aspect:`Good to know`
       - :ref:`"FlashMessage finisher"<apireference-finisheroptions-flashmessagefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
@@ -209,7 +209,7 @@ options.translation.translationFile
 
 :aspect:`Good to know`
       - :ref:`"FlashMessage finisher"<apireference-finisheroptions-flashmessagefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
index cff586a..93c8176 100644 (file)
@@ -39,7 +39,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Form\Domain\Finishers\RedirectFinisher
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
@@ -67,7 +67,7 @@ options.pageUid
 
 :aspect:`Good to know`
       - :ref:`"Redirect finisher"<apireference-finisheroptions-redirectfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Redirect to this page uid.
@@ -95,7 +95,7 @@ options.additionalParameters
 
 :aspect:`Good to know`
       - :ref:`"Redirect finisher"<apireference-finisheroptions-redirectfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Additional parameters which should be used on the target page.
@@ -123,7 +123,7 @@ options.delay
 
 :aspect:`Good to know`
       - :ref:`"Redirect finisher"<apireference-finisheroptions-redirectfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       The redirect delay in seconds.
@@ -151,7 +151,7 @@ options.statusCode
 
 :aspect:`Good to know`
       - :ref:`"Redirect finisher"<apireference-finisheroptions-redirectfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       The HTTP status code for the redirect. Default is "303 See Other".
@@ -179,7 +179,7 @@ options.translation.translationFile
 
 :aspect:`Good to know`
       - :ref:`"Redirect finisher"<apireference-finisheroptions-redirectfinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
index 0424434..d35b0df 100644 (file)
@@ -39,7 +39,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher
 
 :aspect:`Good to know`
-      - :ref:`"Custom finisher implementations"<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+      - :ref:`"Custom finisher implementations"<concepts-finishers-customfinisherimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
@@ -67,7 +67,7 @@ options.table
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Insert or update values into this table.
@@ -98,7 +98,7 @@ options.mode
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       ``insert`` will create a new database row with the values from the submitted form and/or some predefined values. @see options.elements and options.databaseFieldMappings
@@ -128,7 +128,7 @@ options.whereClause
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       This where clause will be used for a database update action.
@@ -156,7 +156,7 @@ options.elements
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Use ``options.elements`` to map form element values to existing database columns.
@@ -186,7 +186,7 @@ options.elements.<formElementIdentifier>.mapOnDatabaseColumn
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       The value from the submitted form element with the identifier ``<formElementIdentifier>`` will be written into this database column.
@@ -214,7 +214,7 @@ options.elements.<formElementIdentifier>.saveFileIdentifierInsteadOfUid
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Set this to true if the database column should not be written if the value from the submitted form element with the identifier
@@ -247,7 +247,7 @@ options.elements.<formElementIdentifier>.skipIfValueIsEmpty
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Set this to true if the database column should not be written if the value from the submitted form element with the identifier
@@ -277,7 +277,7 @@ options.elements.<formElementIdentifier>.dateFormat
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       If the internal Datatype is \DateTime which is true for the form element types "DatePicker" and "Date",
@@ -309,7 +309,7 @@ options.databaseColumnMappings
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Use this to map database columns to static values.
@@ -344,11 +344,11 @@ options.databaseColumnMappings.<databaseColumnName>.value
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       The value which will be written to the database column.
-      You can also use the :ref:`FormRuntime accessor feature<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>` to access every getable property from the ``FormRuntime``
+      You can also use the :ref:`FormRuntime accessor feature<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>` to access every getable property from the ``FormRuntime``
       In short: use something like ``{<formElementIdentifier>}`` to get the value from the submitted form element with the identifier ``<formElementIdentifier>``.
 
       If you use the FormRuntime accessor feature within ``options.databaseColumnMappings``, than the functionality is nearly equal
@@ -377,7 +377,7 @@ options.databaseColumnMappings.<databaseColumnName>.skipIfValueIsEmpty
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
 
 :aspect:`Description`
       Set this to true if the database column should not be written if the value from `options.databaseColumnMappings.
@@ -406,7 +406,7 @@ options.translation.translationFile
 
 :aspect:`Good to know`
       - :ref:`"SaveToDatabase finisher"<apireference-finisheroptions-savetodatabasefinisher>`
-      - :ref:`"Accessing form runtime values"<concepts-frontendrendering-codecomponents-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
+      - :ref:`"Accessing form runtime values"<concepts-finishers-customfinisherimplementations-accessingoptions-formruntimeaccessor>`
       - :ref:`"Translate finisher options"<concepts-frontendrendering-translation-finishers>`
 
 :aspect:`Description`
index 78ec50b..b209dcc 100644 (file)
@@ -41,7 +41,7 @@ Properties
                [...]
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       Array which defines the available serverside validators. Every key within this array is called the ``<validatoridentifier>``.
@@ -101,7 +101,7 @@ Properties
       - :ref:`"[RequiredValidatorEditor] validatorIdentifier"<typo3.cms.form.prototypes.\<prototypeidentifier>.formelementsdefinition.\<formelementtypeidentifier>.formeditor.editors.*.validatoridentifier-requiredvalidatoreditor>`
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       This array key identifies a validator. This identifier could be used to attach a validator to a form element.
@@ -133,7 +133,7 @@ implementationClassName
       Depends (see :ref:`concrete validators configuration <typo3.cms.form.prototypes.\<prototypeidentifier>.validatorsdefinition.\<validatoridentifier>-concreteconfigurations>`)
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: properties/implementationClassName.rst
@@ -160,7 +160,7 @@ options
       Depends (see :ref:`concrete validators configuration <typo3.cms.form.prototypes.\<prototypeidentifier>.validatorsdefinition.\<validatoridentifier>-concreteconfigurations>`)
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       Array with validator options.
index c9311ff..b3e7ed2 100644 (file)
@@ -48,7 +48,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\AlphanumericValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index 4f64c11..dcc30b9 100644 (file)
@@ -49,7 +49,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Form\Mvc\Validation\CountValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index d891253..32b2159 100644 (file)
@@ -48,7 +48,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\DateTimeValidator
  
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index ba19ada..800ae27 100644 (file)
@@ -50,7 +50,7 @@ implementationClassName
              label: formEditor.elements.TextMixin.editor.validators.EmailAddress.label
  
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index a291b32..8ff8aa2 100644 (file)
@@ -43,13 +43,13 @@ implementationClassName
 :aspect:`Default value (for prototype 'standard')`
       .. code-block:: yaml
          :linenos:
-             :emphasize-lines: 2
+         :emphasize-lines: 2
 
              FileSize:
                implementationClassName: TYPO3\CMS\Form\Mvc\Validation\FileSizeValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
@@ -123,7 +123,7 @@ formeditor.iconIdentifier
 :aspect:`Default value (for prototype 'standard')`
       .. code-block:: yaml
          :linenos:
-             :emphasize-lines: 3
+         :emphasize-lines: 3
 
              FileSize:
                formEditor:
@@ -157,7 +157,7 @@ formeditor.label
 :aspect:`Default value (for prototype 'standard')`
       .. code-block:: yaml
          :linenos:
-             :emphasize-lines: 4
+         :emphasize-lines: 4
 
              FileSize:
                formEditor:
@@ -191,7 +191,7 @@ formeditor.predefinedDefaults
 :aspect:`Default value (for prototype 'standard')`
       .. code-block:: yaml
          :linenos:
-             :emphasize-lines: 3-
+         :emphasize-lines: 3-
 
              FileSize:
                formEditor:
index 1aaa0d8..bef5852 100644 (file)
@@ -48,7 +48,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\FloatValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index 5410c05..241fa38 100644 (file)
@@ -48,7 +48,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\IntegerValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index 8dfc230..c45508f 100644 (file)
@@ -51,7 +51,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\NotEmptyValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index 7258432..546676a 100644 (file)
@@ -48,7 +48,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\NumberValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index b09479e..83904fd 100644 (file)
@@ -49,7 +49,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\NumberRangeValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index 166c9df..7294b87 100644 (file)
@@ -48,7 +48,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\RegularExpressionValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index 7c4371b..aa5b096 100644 (file)
@@ -52,7 +52,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\StringLengthValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index d6e1fab..eaa449d 100644 (file)
@@ -48,7 +48,7 @@ implementationClassName
            implementationClassName: TYPO3\CMS\Extbase\Validation\Validator\TextValidator
 
 :aspect:`Good to know`
-      - :ref:`"Custom validator implementations"<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+      - :ref:`"Custom validator implementations"<concepts-validators-customvalidatorimplementations>`
 
 :aspect:`Description`
       .. include:: ../properties/implementationClassName.rst
index e2811bc..a736d40 100644 (file)
@@ -26,7 +26,7 @@ integration.
 
 
 EXT:my_site_package/Configuration/TypoScript/setup.typoscript
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 First of all, register a new EXT:form configuration for the frontend via
 TypoScript.
@@ -103,30 +103,6 @@ When upgrading to TYPO3 v8 an upgrade wizard will tell you if form_legacy is
 still needed.
 
 
-.. _faq-frontend-validation:
-
-Is there a frontend validation?
-===============================
-
-Yes, an HTML 5 based frontend validation is implemented. Nevertheless,
-there is no JavaScript validation included by default. We as the TYPO3
-core have no plans to opt for a specific solution. This has to be integrated manually.
-Reliable and maintained projects are `Parsley <https://github.com/guillaumepotier/Parsley.js>`_
-and `jQuery Validation <https://github.com/jquery-validation/jquery-validation>`_.
-
-
-.. _faq-localize-client-side-validations:
-
-How do I localize the client side validations in the frontend?
-==============================================================
-
-The displayed validation message is a browser specific text. The output is
-not generated by TYPO3 and therefore you cannot change it easily.
-Nevertheless, there is a JavaScript solution for changing the validation
-message. See `Stack Overflow <http://stackoverflow.com/questions/5272433/html5-form-required-attribute-set-custom-validation-message>`_
-for more information.
-
-
 .. _faq-date-picker:
 
 How does the date picker work?
@@ -192,9 +168,9 @@ and see the forge issue `#82422 <https://forge.typo3.org/issues/82422#note-6>`_.
 How do I create a custom finisher for my form?
 ==============================================
 
-:ref:`Learn how to create a custom finisher here.<concepts-frontendrendering-codecomponents-customfinisherimplementations>`
+:ref:`Learn how to create a custom finisher here.<concepts-finishers-customfinisherimplementations>`
 
-If you want to make the finisher configurable in the backend UI read :ref:`here<concepts-formeditor-extending-custom-finisher>`.
+If you want to make the finisher configurable in the backend UI read :ref:`here<concepts-finishers-customfinisherimplementations-extend-gui>`.
 
 
 .. _faq-form-element-custom-validator:
@@ -202,7 +178,7 @@ If you want to make the finisher configurable in the backend UI read :ref:`here<
 How do I create a custom validator for my form?
 ===============================================
 
-:ref:`Learn how to create a custom validator here.<concepts-frontendrendering-codecomponents-customvalidatorimplementations>`
+:ref:`Learn how to create a custom validator here.<concepts-validators-customvalidatorimplementations>`
 
 
 .. faq-form-proposed-folder-structure: