# Contact form extending

{% hint style="info" %}
**IMPORTANT NOTE:** Our free support doesn't cover help with these customisations. Especially because PHP form processing is time-consuming to debug.&#x20;

But, if you need help with the integration of complex forms, you can [**hire us**](https://www.one.thezero.club/hire-us) to do that for you.
{% endhint %}

**Four files rule the contact form:**

1. `site/plugins/zero-one/snippets/contact/form.php` The frontend of the form
2. Controllers:
   * `site/plugins/zero-one/controllers/site.php` The controller used the contact form.
3. Email templates:
   * `site/plugins/zero-one/templates/emails/email.php` Plain text email template
   * `site/plugins/zero-one/templates/emails/email.html.php` HTML email template

**Basic knowledge needed**

Before going further, it is advisable that you have basic knowledge of how PHP contact forms work, and to read through these:

* <https://getkirby.com/docs/cookbook/forms/basic-contact-form> Basic Kirby contact form
* <https://www.one.thezero.club/guide/theme-extending> How to properly extend Zero One

## New form field example

Let's say you want to add a new field "Company" to the form.&#x20;

### Form frontend

* Copy `site/plugins/zero-one/snippets/contact/form.php`&#x20;
* to `site/theme/snippets/contact/form.php` and open it with your code editor
* Also, open <https://getuikit.com/docs/form> page to see what frontend options are available

**Every field must have these attributes:**

* Unique
  * name
  * value
* Optional
  * alert

This new field won't be required, but we will create a new rule for it.

```php
// New company field
<label for="company">
Company
</label>
<input class="uk-input" type="text" id="company" name="company" value="<?= $data['company'] ?? '' ?>">
<?= isset($alert['company']) ? '<span class="uk-text-danger">' . html($alert['company']) . '</span>' : '' ?>
```

### Controller

* Copy `site/plugins/zero-one/controllers/site.php`
* To `site/theme/controllers/site.php`

#### Import data

Now you must add new field data to that controller.&#x20;

```php
// Recieve data from form
$data = [
    'name'  => get('name'),
    'email' => get('email'),
    'text'  => get('text'),
    // New company field data
    'company'  => get('company')
];
```

#### Add rule

Add a new rule for that field.

```php
// Field rules
$rules = [
    'name'  => ['required', 'minlength' => 3],
    'email' => ['required', 'email'],
    'text'  => ['required', 'minlength' => 3, 'maxlength' => 3000],
    // New company field rule
    'company'  => ['minlength' => 3, 'maxlength' => 100]
];
```

#### Alert message for that rule

Add an alert message for that new field.

```php
// Alert messages for the rules
$messages = [
    'name'  => esc($site->labelAlertName()->or('Please enter a valid name')),
    'email' => esc($site->labelAlertEmail()->or('Please enter a valid email address')),
    'text'  => esc($site->labelAlertMessage()->or('Please enter a text between 3 and 3000 characters')),
    // New company field alert message
    'company'  => esc'Please enter a text between 3 and 100 characters'
];
```

#### Export data to email

And lastly, export that data to email.

```php
// Export to email
$kirby->email([
    'template' => 'email',
    'from'     => esc($site->email()),
    'replyTo'  => $data['email'],
    'to'       => esc($site->email()),
    'subject'  => esc($data['name']) . ' ' . esc($site->labelEmailSubject()->or('sent you a message from your contact form')),
    'data'     => [
        'text'   => esc($data['text']),
        'sender' => esc($data['name']),
        // New company field data
        'company' => esc($data['company'])
    ]
]);
```

Now, your new field is ready, the only thing left to do is add that data to the email content.

### Email content

* Copy `site/plugins/zero-one/templates/emails/email.php`
* To `site/theme/templates/emails/email.php`

And

* Copy `site/plugins/zero-one/templates/emails/email.html.php`
* To `site/theme/templates/emails/email.html.php`

Now add new "Company" field content to emails.

```php
// Plain text email (email.php)
Hello Company,

Company: <?= $company ?>

<?= $text ?>

Best regards,
<?= $sender ?>
```

```php
// HTML email (email.html.php)
Hello Company,

<p>Company: <?= $company ?></p>

<p><?= $text ?></p>

<p>Best regards,</p>
<p><?= $sender ?></p>
```

And that's it!

Your new field is connected and ready to go. You can add as many fields as you like.&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.one.thezero.club/guide/theme-extending/contact-form-extending.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
