---
title: 'Reference: Form Actions'
url: 'https://learn.getgrav.org/2/forms/forms/reference-form-actions'
markdown: 'https://learn.getgrav.org/2/forms/forms/reference-form-actions.md'
date: '2026-09-17'
description: 'Reference: Form Actions Form actions We saw some example form actions in the simple form example above. Let''s detail the actions you can use. Email Sends an email with the specified options. Example: YAMLCopy 1process: 2 - email: 3 from: "{{ config.plugins.email.from }}" 4 to: "…'
taxonomy:
  category:
    - docs
---

# Reference: Form Actions

## Form actions

We saw some example form actions in the simple form example above. Let's detail the actions you can use.

### Email

Sends an email with the specified options.

Example:

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">e</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">mail</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">f</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rom</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">{{ config.plugins.email.from }}</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 4</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">t</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">o</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">{{ config.plugins.email.to }}</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 5</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">s</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ubject</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">Contact by {{ form.value.name|e }}</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 6</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">b</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ody</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">{% include 'forms/data.html.twig' %}</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token">
</span></span>
```

Sends an email from the email address specified in the Email plugin configuration, sends it to that same email address (it's a contact form, we send it to ourselves). Unless you want to use other values, you could freely omit from and to, as they are already configured by default to use these values.

 Caution

If you have a "full" email address (e.g., `My Name <myemail@example.com>`) stored in a file like site.yaml, and you are using Twig to refer to it, be sure to include the `|raw` filter (e.g., `{{ config.site.emails.sales|raw }}`. Otherwise, you will encounter "An email must have a 'To', 'Cc', or 'Bcc' header" errors.

The email has the set subject and body. In this case, the body is generated by the `forms/data.html.twig` file, which is found in the active template (Antimatter and the other main themes have it, but it's not guaranteed that every theme includes it).

Antimatter sets it to

TWIG

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{%</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">for</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">field</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #56b6c2">in</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">form</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">.</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">fields</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">%}</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"><</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">div</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">></span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"><</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">strong</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">></span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{{</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">field</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">.</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">label</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">}}</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"></</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">strong</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">></span><span class="token">: </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{{</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">string</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">(</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">form</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">.</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">value</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">(</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">field</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">.</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">name</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">)</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">|</span><span class="token" style="color: #0184BC;;--phiki-dark-color: #56b6c2">e</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">)</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">}}</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"></</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">div</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">></span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{%</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">endfor</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">%}</span><span class="token">
</span></span>
```

In short, it just loops the values and prints them in the email body.

 Caution

Refer to the email plugin documentation for additional [important form email options](https://github.com/getgrav/grav-plugin-email#emails-sent-with-forms) including [multipart message bodies](https://github.com/getgrav/grav-plugin-email#multi-part-mime-messages) (good for anti-spam scores), `reply_to`, and [attachments](https://github.com/getgrav/grav-plugin-email#sending-attachments).

##### Dynamic email attribute

If you want for example to set the `email.from` field from a Form input, you can get its content and use it in this way:

`from: "{{ form.value.email|e }}"`

In this case, we get the field "email" from the form, and use it for the "from" attribute. This way the site owner will receive an email and will be able to directly reply to the email entered in the form.

### Redirect

Redirects the user to another page. The action is immediate, so if you use this, you probably need to put it at the bottom of the actions list.

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">r</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">edirect</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">/forms/landing-page</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token">
</span></span>
```

You may also set some or all of the `redirect` field from a form input or hidden form field. You can get its content and use it in this way:

`redirect: "/path to/location/{{ form.value.hiddenfield }}"`

In this case, we get the field "hiddenfield" from the form, and use it for the last portion of the redirect location. This can be useful when creating forms that, for example, redirect to a download upon completion.

### Message

Sets a message to be shown upon form submission.

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">m</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">essage</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">T</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">hank you for your feedback!</span><span class="token">
</span></span>
```

By default, the message will be rendered at the beginning of the `form` element.

However, you can optionally modify the presentation either through `display` or through `redirect`.

#### Validation Message

You can utilize the message action to trigger in the event of a failed validation. For example:

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">u</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">sername</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">   </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">t</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ype</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">t</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">ext</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token">   </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">l</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">abel</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">U</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">sername</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 4</span><span class="token">   </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">v</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">alidate</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 5</span><span class="token">     </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">r</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">equired</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #986801;;--phiki-dark-color: #d19a66">true</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 6</span><span class="token">     </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">m</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">essage</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">M</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">y custom message when validation fails!</span><span class="token">
</span></span>
```

This will enable you to write a custom message that users will see in the event that validation fails.

### Display

After submitting the form, the presentation of the form will update to embed a subpage. So for example, if your form lives in `/form`, you can embed the subpage `/form/thankyou` with the following code:

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">d</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">isplay</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">t</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">hankyou</span><span class="token">
</span></span>
```

If you prefer to embed an absolute page path, like `site.com/thankyou`, prepend it with `/`, for example: `display: /thankyou`.

The Form plugin provides a `formdata` template that's suitable for the process destination page, as it outputs the result of the form submission. In the above example, you could create a `pages/form/thankyou/formdata.md` page.

Antimatter and compatible themes provide the `formdata.html.twig` Twig template, that looks like this:

TWIG

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{%</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">extends</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">partials/base.html.twig</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">%}</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{%</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">block</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">content</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">%}</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 4</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 5</span><span class="token">    </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{{</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">content</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">|</span><span class="token" style="color: #0184BC;;--phiki-dark-color: #56b6c2">raw</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">}}</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 6</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 7</span><span class="token">    </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"><</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">div</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #986801;;--phiki-dark-color: #d19a66">class</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">=</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">alert</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">></span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{{</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">form</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">.</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">message</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">|</span><span class="token" style="color: #0184BC;;--phiki-dark-color: #56b6c2">e</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">}}</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"></</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">div</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">></span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 8</span><span class="token">    </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"><</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">></span><span class="token">Here is the summary of what you wrote to us:</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"></</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">></span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 9</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">10</span><span class="token">    </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{%</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">include</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">forms/data.html.twig</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">%}</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">11</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">12</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{%</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">endblock</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">%}</span><span class="token">
</span></span>
```

If the `thankyou/formdata.md` page is

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token">---</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">t</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">itle</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">E</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">mail sent</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">c</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ache_enable</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #986801;;--phiki-dark-color: #d19a66">false</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 4</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 5</span><span class="token">    </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">t</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">wig</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #986801;;--phiki-dark-color: #d19a66">true</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 6</span><span class="token">---</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 7</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 8</span><span class="token" style="color: #A0A1A7;font-style: italic;;--phiki-dark-color: #7f848e;--phiki-dark-font-style: italic">#</span><span class="token" style="color: #A0A1A7;font-style: italic;;--phiki-dark-color: #7f848e;--phiki-dark-font-style: italic"># Email sent!</span><span class="token" style="color: #A0A1A7;font-style: italic;;--phiki-dark-color: #7f848e;--phiki-dark-font-style: italic">
</span></span>
```

The output will be a page with the "Email sent!" title, followed by a confirmation message and the form data entered in the previous page.

You could use any page type you want, as a destination page. Just create your own and set the destination page type accordingly.

### Save

Saves the form data to a file. The file is saved to the `user/data` folder, in a subfolder named as the `form.name` parameter. The form **must** have a name for this action to succeed, and the subfolder must be created with appropriate permissions before data can be saved in it, as a new directory will not be created if one does not exist. For example:

 Caution

The `fileprefix` and `body` can contain Twig markup.

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">s</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ave</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">f</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ileprefix</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">f</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">eedback-</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 4</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">d</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ateformat</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">Y</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">md-His-u</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 5</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">e</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">xtension</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">t</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">xt</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 6</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">b</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ody</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">{% include 'forms/data.save.txt.twig' %}</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 7</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">o</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">peration</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">c</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">reate</span><span class="token">
</span></span>
```

Saved submissions may contain private data. Confirm that your web server blocks their URLs, including when nginx serves static files in front of Apache. If your host exposes `.txt` but blocks `.dat`, `extension: dat` is an interim option; test it with harmless data first. Extensions on `security.uploads_dangerous_extensions` are rejected, so changing to `yaml` or `json` may make the save action fail. See [User Folder Exposure](https://learn.getgrav.org/security/user-folder-exposure) for the server-side protections required.

If you leave `body` out entirely, it defaults to `forms/data.save.txt.twig`. That template is provided by the Form plugin, and a theme can override it with its own `templates/forms/data.save.txt.twig`. Use it rather than `forms/data.txt.twig` for saved files: `forms/data.txt.twig` is HTML-escaped because it also gets included into HTML email bodies, which would store `Tom &amp; Jerry` instead of `Tom & Jerry` in the saved file.

 Warning

the `operation` can be either `create` (default) to create a new file per-form-submission or `add` to append to a single file.

 Warning

note that the `add` operation now requires a static filename: to be defined see the example below.

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">s</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ave</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">f</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ilename</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">f</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">eedback.txt</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 4</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">b</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ody</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">{% include 'forms/data.save.txt.twig' %}</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">"</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 5</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">o</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">peration</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">a</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">dd</span><span class="token">
</span></span>
```

### Captcha

To also validate the captcha server-side, add the captcha process action.

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">c</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">aptcha</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">r</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ecaptcha_secret</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">E</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">NTER_YOUR_CAPTCHA_SECRET_KEY</span><span class="token">
</span></span>
```

 Caution

The `recaptcha_secret` is optional and will use the Form plugin's configuration values if you have provided them there.

### User IP Address

Display the user's IP address on the output. Put it above email / save processes in the 'form.md' to ensure it is used by the output processe(s).

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">i</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">l</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">abel</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">U</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">ser IP Address</span><span class="token">
</span></span>
```

### Timestamp

Add a form submission timestamp to the output. Put it above email / save processes in the 'form.md' to ensure it is used by the output process(es).

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">t</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">imestamp</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token">        </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">l</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">abel</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">S</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">ubmission Timestamp</span><span class="token">
</span></span>
```

### Reset the form after submit

By default, the form is not cleared after the submit. So if you don't have a `display` action and the user is sent back to the form page, it's still filled with the data entered. If you want to avoid this, add a `reset` action:

YAML

```
<span class="line"><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">r</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">eset</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #986801;;--phiki-dark-color: #d19a66">true</span><span class="token">
</span></span>
```

### Remember field values

Using the `remember` action, you can allow your users to have *some* field values "recalled" from the last time a form was submitted. This is especially useful for forms which are submitted repeatedly, like an anonymous submission that requires information about the submitter.

 Warning

[HTML5](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete) and [Grav's Form plugin](https://learn.getgrav.org/2/forms/forms/fields-available#common-field-attributes) already provide this in limited ways through the browser, so do make use of this. However, you may find that autocomplete doesn't work reliably for some users and fields.

 Warning

The `remember` action **uses cookies** to store the last value, so it will only work on the same device and browser where the browser is configured to allow them from your site.

To use this action, simply list the names of the fields you would like to be remembered.

For example, an online medical referral form is a good use case. These are typically completed from the same computer with some field values that rarely change and are boring to complete repeatedly.

YAML

```
<span class="line"><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">r</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">emember</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">r</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">eferrer-name</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">r</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">eferrer-address</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">r</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">eferrer-specialty</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">p</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">referred-practitioner</span><span class="token">
</span></span>
```

## Custom Actions

You can "hook" into a form processing and perform any kind of operation. Perform custom processing, add data for an online web application, even save to a database.

To do this, in the form process field add your own processing action name, for example 'yourAction'.

YAML

```
<span class="line"><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">rocess</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">y</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ourAction</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #986801;;--phiki-dark-color: #d19a66">true</span><span class="token">
</span></span>
```

Then, create a simple plugin.

In its main PHP file, register for the event `onFormProcessed`

PHP

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">namespace</span><span class="token"> </span><span class="token" style="color: #C18401;;--phiki-dark-color: #e5c07b">Grav</span><span class="token" style="color: #C18401;;--phiki-dark-color: #e5c07b">\</span><span class="token" style="color: #C18401;;--phiki-dark-color: #e5c07b">Plugin</span><span class="token" style="--phiki-dark-color: #abb2bf">;</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">use</span><span class="token"> </span><span class="token" style="--phiki-dark-color: #abb2bf">Grav</span><span class="token" style="--phiki-dark-color: #abb2bf">\</span><span class="token" style="--phiki-dark-color: #abb2bf">Common</span><span class="token" style="--phiki-dark-color: #abb2bf">\</span><span class="token" style="color: #C18401;;--phiki-dark-color: #e5c07b">Plugin</span><span class="token" style="--phiki-dark-color: #abb2bf">;</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">use</span><span class="token"> </span><span class="token" style="--phiki-dark-color: #abb2bf">RocketTheme</span><span class="token" style="--phiki-dark-color: #abb2bf">\</span><span class="token" style="--phiki-dark-color: #abb2bf">Toolbox</span><span class="token" style="--phiki-dark-color: #abb2bf">\</span><span class="token" style="--phiki-dark-color: #abb2bf">Event</span><span class="token" style="--phiki-dark-color: #abb2bf">\</span><span class="token" style="color: #C18401;;--phiki-dark-color: #e5c07b">Event</span><span class="token" style="--phiki-dark-color: #abb2bf">;</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 4</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 5</span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">class</span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #C18401;;--phiki-dark-color: #e5c07b">EmailPlugin</span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">extends</span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #C18401;;--phiki-dark-color: #e5c07b">Plugin</span><span class="token" style="color: #383A42;">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 6</span><span class="token" style="color: #383A42;">{</span><span class="token" style="color: #383A42;">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 7</span><span class="token" style="color: #383A42;">    </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">public</span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">static</span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">function</span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #4078F2;;--phiki-dark-color: #61afef">getSubscribedEvents</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">(</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">)</span><span class="token" style="color: #383A42;">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 8</span><span class="token" style="color: #383A42;">    </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">{</span><span class="token" style="color: #383A42;">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 9</span><span class="token" style="color: #383A42;">        </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">return</span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">[</span><span class="token" style="color: #383A42;">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">10</span><span class="token" style="color: #383A42;">            </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">onFormProcessed</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">=></span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">[</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">onFormProcessed</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">,</span><span class="token" style="color: #383A42;"> </span><span class="token" style="color: #986801;;--phiki-dark-color: #d19a66">0</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">]</span><span class="token" style="color: #383A42;">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">11</span><span class="token" style="color: #383A42;">        </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">]</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">;</span><span class="token" style="color: #383A42;">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">12</span><span class="token" style="color: #383A42;">    </span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">}</span><span class="token" style="color: #383A42;">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">13</span><span class="token" style="color: #383A42;">}</span><span class="token">
</span></span>
```

Then provide a handler for the saveToDatabase action:

PHP

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">public</span><span class="token"> </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">function</span><span class="token"> </span><span class="token" style="color: #4078F2;;--phiki-dark-color: #61afef">onFormProcessed</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">(</span><span class="token" style="color: #C18401;;--phiki-dark-color: #e5c07b">Event</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">$</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">event</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">)</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token" style="--phiki-dark-color: #abb2bf">{</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token">    </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">$</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">form</span><span class="token"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #56b6c2">=</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">$</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">event</span><span class="token" style="--phiki-dark-color: #abb2bf">[</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">form</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="--phiki-dark-color: #abb2bf">]</span><span class="token" style="--phiki-dark-color: #abb2bf">;</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 4</span><span class="token">    </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">$</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">action</span><span class="token"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #56b6c2">=</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">$</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">event</span><span class="token" style="--phiki-dark-color: #abb2bf">[</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">action</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="--phiki-dark-color: #abb2bf">]</span><span class="token" style="--phiki-dark-color: #abb2bf">;</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 5</span><span class="token">    </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">$</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">params</span><span class="token"> </span><span class="token" style="color: #383A42;;--phiki-dark-color: #56b6c2">=</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">$</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">event</span><span class="token" style="--phiki-dark-color: #abb2bf">[</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">params</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="--phiki-dark-color: #abb2bf">]</span><span class="token" style="--phiki-dark-color: #abb2bf">;</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 6</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 7</span><span class="token">    </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">switch</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">$</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">action</span><span class="token">)</span><span class="token"> </span><span class="token" style="--phiki-dark-color: #abb2bf">{</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 8</span><span class="token">        </span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">case</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">yourAction</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">'</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 9</span><span class="token">            </span><span class="token" style="color: #A0A1A7;font-style: italic;;--phiki-dark-color: #7f848e;--phiki-dark-font-style: italic">//</span><span class="token" style="color: #A0A1A7;font-style: italic;;--phiki-dark-color: #7f848e;--phiki-dark-font-style: italic">do what you want</span><span class="token" style="color: #A0A1A7;font-style: italic;;--phiki-dark-color: #7f848e;--phiki-dark-font-style: italic">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">10</span><span class="token">    </span><span class="token" style="--phiki-dark-color: #abb2bf">}</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">11</span><span class="token" style="--phiki-dark-color: #abb2bf">}</span><span class="token">
</span></span>
```

If your processing might go wrong and you want to stop the next form actions, which are executed in series, you can stop the processing by calling `stopPropagation` on the $event object:

PHP

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">$</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">event</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">-></span><span class="token" style="color: #4078F2;;--phiki-dark-color: #61afef">stopPropagation</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">(</span><span class="token" style="color: #383A42;;--phiki-dark-color: #abb2bf">)</span><span class="token" style="--phiki-dark-color: #abb2bf">;</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token" style="color: #A626A4;;--phiki-dark-color: #c678dd">return</span><span class="token" style="--phiki-dark-color: #abb2bf">;</span><span class="token">
</span></span>
```

Sample code with form handling is available in the Form plugin, and in the Email plugin repositories.

#### An example of custom form handling

The Form plugin offers this ability of sending emails, saving files, setting status messages and it’s really handy. Sometimes however you need total control. That’s for example what the Login plugin does.

It defines the `login.md` page frontmatter:

YAML

```
<span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 1</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">t</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">itle</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">L</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">ogin</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 2</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">t</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">emplate</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">f</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">orm</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 3</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 4</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">f</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">orm</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 5</span><span class="token">    </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">n</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ame</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">l</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">ogin</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 6</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 7</span><span class="token">    </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">f</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ields</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 8</span><span class="token">        </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">n</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ame</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">u</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">sername</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none"> 9</span><span class="token">          </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">t</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ype</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">t</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">ext</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">10</span><span class="token">          </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">laceholder</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">U</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">sername</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">11</span><span class="token">          </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">a</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">utofocus</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #986801;;--phiki-dark-color: #d19a66">true</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">12</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">13</span><span class="token">        </span><span class="token" style="--phiki-dark-color: #abb2bf">-</span><span class="token"> </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">n</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ame</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">p</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">assword</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">14</span><span class="token">          </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">t</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">ype</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">p</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">assword</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #9D9D9F;-webkit-user-select: none">15</span><span class="token">          </span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">p</span><span class="token" style="color: #E45649;;--phiki-dark-color: #e06c75">laceholder</span><span class="token" style="--phiki-dark-color: #abb2bf">:</span><span class="token"> </span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">P</span><span class="token" style="color: #50A14F;;--phiki-dark-color: #98c379">assword</span><span class="token">
</span></span>
```

The Forms plugin correctly generates and shows the form. Notice there’s no `process` defined.

The form `buttons` are missing too, since they’re manually added in `templates/login.html.twig`. That’s where the form `action` and `task` are defined too.

In this case, `task` is `login.login`, and `action` is set to the page url.

When a user presses 'Login' in the form, Grav calls the `onTask.login.login` event.

`user/plugins/login/login.php` hooks up to `onTask.login.login` to its `classes/controller.php` file, and that's where the authentication happens.

 [ Edit this page on Github ](https://github.com/getgrav/grav-learn/edit/develop/pages/2/06.forms/02.forms/04.reference-form-actions/doc.md) 

 © 2026 Grav Documentation. All rights reserved.

---

## Navigation

- Parent: [Frontend Forms](https://learn.getgrav.org/2/forms/forms.md)
- Previous: [Example: Contact Form](https://learn.getgrav.org/2/forms/forms/example-form.md)
- Next: [How to: Forms in modular pages](https://learn.getgrav.org/2/forms/forms/how-to-forms-in-modular-pages.md)
