# Static Forms

{% hint style="success" %}
This is the official documentation of the `forestadmin/laravel-forestadmin` v2+ and `forestadmin/symfony-forestadmin` PHP agents.
{% endhint %}

Very often, you will need to ask for user inputs before triggering the logic behind an action.

For example, you might want to specify a reason if you want to block a user account. Or set the amount to charge a user’s credit card.

![Action Form displayed on Forest Admin](/files/Mjfet8Gzd7EAoLqP2Yd7)

## Field Configuration

### Properties

Fields are configurable using the following properties:

| Property       | Expected value                                                                                                                                                                               | Description                                                                                                               |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `type`         | `FieldType::{BOOLEAN`, `DATE`, `DATE_ONLY`, `ENUM`, `JSON`, `NUMBER`, `STRING`, `NUMBER_LIST`, `ENUM_LIST`, `STRING_LIST`, `LIST`, `FILE_LIST` and [`COLLECTION`](#references-to-records)`}` | Set the type of the field.                                                                                                |
| `label`        | string                                                                                                                                                                                       | Set the label of the field.                                                                                               |
| `id`           | string                                                                                                                                                                                       | Set the id of the field. The is used internally and to access values from the context. If not set the label will be used. |
| `description`  | string                                                                                                                                                                                       | Set the description of the field.                                                                                         |
| `isRequired`   | boolean                                                                                                                                                                                      | Make the field required (default false).                                                                                  |
| `isReadOnly`   | boolean                                                                                                                                                                                      | Make the field read-only (default false).                                                                                 |
| `defaultValue` | any                                                                                                                                                                                          | Set the default value of the field.                                                                                       |
| `enumValues`   | array of strings                                                                                                                                                                             | Change the list of possible values of the field when type is `FieldType::ENUM`.                                           |

```php
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\BaseAction;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\Context\ActionContextSingle;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\DynamicField;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\ResultBuilder;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\Types\ActionScope;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\Types\FieldType;

$forestAgent->customizeCollection(
  'Customer',
  function (CollectionCustomizer $builder) {
    $builder->addAction('Charge credit card', new BaseAction(
      scope: ActionScope::SINGLE,
      form: [
        new DynamicField(
          type: FieldType::NUMBER,
          label: 'amount',
          description: 'The amount (USD) to charge the credit card. Example: 42.50',
          isRequired: true,
        ),
      ]
      execute: function(ActionContextSingle $context, ResultBuilder $resultBuilder) {
        $record = $context->getRecord(['stripeId', 'address:country']);
        $formValues = $context->getFormValues();

        /* ... Charge the credit card here ... */

        return $resultBuilder->success('Amount charged!');
      }
    ));
  }
);
```

### References to records

![Reference widget on an action form](/files/JXZ8GbZFLnXrAEID4AYu)

When using the `Collection` type, you can create a reference to a record of any collection.

The value of the field will be the primary key of the selected record.

{% hint style="info" %}
Note that the value will be stored in an array as the target collection may be using a composite primary key. When not using a composite primary key, the array can be assumed to contain a single value.
{% endhint %}

```php
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\BaseAction;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\Context\ActionContextSingle;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\DynamicField;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\ResultBuilder;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\Types\ActionScope;
use ForestAdmin\AgentPHP\DatasourceCustomizer\Decorators\Actions\Types\FieldType;

$forestAgent->customizeCollection(
  'ticket',
  function (CollectionCustomizer $builder) {
    $builder->addAction('Assign ticket', new BaseAction(
      scope: ActionScope::SINGLE,
      form: [
        new DynamicField(
          label: 'Assignee',
          description: 'The user to assign the ticket to',
          type: FieldType::COLLECTION,
          collectionName: 'user',
          isRequired: true,
        ),
      ]
      execute: function(ActionContextSingle $context, ResultBuilder $resultBuilder) {
        // Retrieve user id from the form
        $formValues = $context->getFormValues();
      }
    ));
  }
);
```


---

# 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://docs.forestadmin.com/developer-guide-agents-php/agent-customization/actions/forms-static.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.
