# Configuration

A generated crud controller contains a method named `getConfiguration`. This methods returns a instance of `App\Core\Crud\CrudConfiguration`.

## setPageTitle

`setPageTitle(string $page, string $title)`

Set the title of the given page.

Example of usage in a CRUD template: `<title>{{ configuration.pageTitle('index') }}</title>`.

## setPageRoute

`setPageRoute(string $page, string $route)`

Set the route of the given page. By default, pages are: `index`, `edit`, `new`, `show`. You can create a custom page for a custom controller.

Example of usage in a CRUD template: `<a href="{{ path(configuration.pageRoute('new')) }}">...</a>`.

## setForm

`setForm(string $context, string $form, `array` $options = [])`

Set the form used in the given context.

## setFormOptions

`setFormOptions(string $context, `array` $options = [])`

Defines options given to a form.

## setAction

`setAction(string $page, string $action, bool|callable $enabled)`

Set if an action is enabled or not in the given page. Take a look at `core/Resources/views/admin/crud/*.html.twig` for more information. Depending the context, the callable could receive the entity in parameter. Example:

```
->setAction('index', 'edit', function(EntityInterface $entity) {
    return $entity->getUser()->getId() === $this->getUser()->getId();
})
```

Usage in a CRUD template: `{% if configuration.action('index', 'new')%}...{% endif %}`.

## setActionTitle

`setActionTitle(string $page, string $action, string $title)`

Set the title of an action in the given page.

Example of usage in a CRUD template: `{{ configuration.actionTitle(context, 'new', 'New')|trans }}`

## setView

`setView(string $context, string $view)`

Override a view.

| Controller (context)   | View                                | Description                   |
| ----------             | ----                                | -----------                   |
| `index`                | `@Core/admin/crud/index.html.twig`  | Template of the page `index`  |
| `edit`                 | `@Core/admin/crud/edit.html.twig`   | Template of the page `edit`   |
| `new`                  | `@Core/admin/crud/new.html.twig`    | Template of the page `new`    |
| `show`                 | `@Core/admin/crud/show.html.twig`   | Template of the page `show`   |
| `filter`               | `@Core/admin/crud/filter.html.twig` | Template of the page `filter` |

| Form (context)      | View                                            | Description                                |
| ----                | ----                                            | -----------                                |
| `form`              | `@Core/admin/crud/_form.html.twig`              | Template to render a form                  |
| `form_widget`       | `@Core/admin/crud/_form_widget.html.twig`       | Template to render a form widget           |
| `form_translations` | `@Core/admin/crud/_form_translations.html.twig` | Template to render a the translation field |

| Entity (context) | View                               | Description                   |
| ------           | ----                               | -----------                   |
| `show_entity`    | `@Core/admin/crud/_show.html.twig` | Template to render the entity |

## setViewDatas

`setViewDatas(string $context, `array` $datas)` and `addViewData(string $context, string $name, $value)`

Add datas given to a view. Useful in a custom controller.

## setField

`setField(string $context, string $label, string $field, `array` $options)`

Add a field displayed in the given context. Used in the index.

```
use App\Core\Crud\Field;

$configuration->setField('index', 'Title', Field\TextField::class, [
    // options
])
```

All fields have these options:

| Option              | Type       | Default                                 | Description                                                |
| ------              | ----       | -------                                 | -----------                                                |
| `property`          | `string`   | `null`                                  | Entity's property to display                               |
| `property__builder` | `callable` | `null`                                  | A callable data and used to generate the content displayed |
| `view`              | `string`   | `@Core/admin/crud/field/text.html.twig` | The templated rendered                                     |
| `default_value`     | `string`   | `null`                                  | Default value to display when the property is `null`       |
| `action`            | `string`   | `null`                                  | An action to perform on click (`null`, `edit`, `view`)     |
| `raw`               | `boolean`  | `false`                                 | Render as HTML                                             |
| `sort`              | `array     | callable`                               | `null`                                                     | Defines how to sort                     |
| `href`              | `string    | callable`                               | `null`                                                     | Data to generate a link                 |
| `href_attr`         | `array     | callable`                               | `null`                                                     | Attributes of the link                  |
| `inline_form`       | `null      | callable`                               | `null`                                                     | A method to define a form to edit datas |
| `inline_form_validation`       | `null      | callable`                               | `null`                                                     | A method to define a custom form validation callback |


```php-inline title="Example #0"
$configuration->setField('index', 'My field', TextField::class, [
    'property' => 'myProperty',
    // OR
    'property_builder' => function($entity, array $options) {
        return $entity->getMyProperty();
    },
])
```

```php-inline title="Example #1"
$configuration->setField('index', 'My field', TextField::class, [
    'raw' => true,
    'property_builder' => function($entity, array $options) {
        return sprintf('<span class="foo">%s</span>', $entity->getBar());
    },
])
```

```php-inline title="Example #2"
// https://127.0.0.7:8000/admin/my_entity?_sort=property&_sort_direction=asc
$configuration->setField('index', 'My field', TextField::class, [
    'property' => 'myProperty'
    'sort' => ['property', '.myProperty'],
    // OR
    'sort' => ['property', function(MyEntityRepositoryQuery $query, $direction) {
        $query->orderBy('.myProperty', $direction);
    }],
])
```

```php-inline title="Example #3"
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Validator\Constraints\NotBlank;

$configuration->setField('index', 'My field', TextField::class, [
    'property' => 'myProperty',
    'inline_form' => function(FormBuilderInterface $builder, EntityInterface $entity) {
        $builder->add('myProperty', TextType::class, [
            'required' => true,
            'constraints' => [new NotBlank()],
        ]);
    }
])
```

### TextField

`App\Core\Crud\Field\TextField`

| Option | Type     | Default                                 | Description            |
| ------ | ----     | -------                                 | -----------            |
| `view` | `string` | `@Core/admin/crud/field/text.html.twig` | The templated rendered |

### DateField

`App\Core\Crud\Field\DateField`

| Option   | Type     | Default                                 | Description            |
| ------   | ----     | -------                                 | -----------            |
| `view`   | `string` | `@Core/admin/crud/field/date.html.twig` | The templated rendered |
| `format` | `string` | `Y-m-d`                                 | The date format        |

### DatetimeField

`App\Core\Crud\Field\DatetimeField`

| Option   | Type     | Default                                 | Description            |
| ------   | ----     | -------                                 | -----------            |
| `view`   | `string` | `@Core/admin/crud/field/date.html.twig` | The templated rendered |
| `format` | `string` | `Y-m-d H:i:s`                           | The date format        |

### ButtonField

`App\Core\Crud\Field\ButtonField`

| Option                | Type        | Default                                   | Description                                         |
| ------                | ----        | -------                                   | -----------                                         |
| `view`                | `string`    | `@Core/admin/crud/field/button.html.twig` | The templated rendered                              |
| `button_attr`         | `array`     | `[]`                                      | Button HTML attributes                              |
| `button_attr_builder` | `callabled` | `null`                                    | A callable data and used to generate `button__attr` |
| `button_tag`          | `string`    | `button`                                  | HTML tag of the button                              |

### ImageField

`App\Core\Crud\Field\ImageField`

| Option       | Type     | Default                                  | Description            |
| ------       | ----     | -------                                  | -----------            |
| `view`       | `string` | `@Core/admin/crud/field/image.html.twig` | The templated rendered |
| `image_attr` | `array`  | `[]`                                     | Image HTML attributes  |

### BooleanField

`App\Core\Crud\Field\BooleanField`

| Option                      | Type     | Default                                    | Description                                                          |
| ------                      | ----     | -------                                    | -----------                                                          |
| `view`                      | `string` | `@Core/admin/crud/field/boolean.html.twig` | The templated rendered                                               |
| `display`                   | `string` | `toggle`                                   | Type of render (`toggle` or `checkbox`)                              |
| `checkbox_class_when_true`  | `string` | `fa-check-square`                          | HTML class added when the value is `true` and display is `checkbox`  |
| `checkbox_class_when_false` | `string` | `fa-square`                                | HTML class added when the value is `false` and display is `checkbox` |
| `toggle_class_when_true`    | `string` | `bg-success`                               | HTML class added when the value is `true` and display is `toggle`    |
| `toggle_class_when_false`   | `string` | `bg-secondary`                             | HTML class added when the value is `false` and display is `toggle`   |

## setMaxPerPage

`setMaxPerPage(string $page, int $max)`

Set how many elements are displayed in a single page.

## setI18n

`setI18n(array $locales, string $defaultLocale)`

Set an array of locales for a translatable entity. The default locale is used in the index page.
Compatible with [https://github.com/KnpLabs/DoctrineBehaviors/blob/master/docs/translatable.md](https://github.com/KnpLabs/DoctrineBehaviors/blob/master/docs/translatable.md).

## setDefaultSort

`setDefaultSort(string $context, string $label, string $direction = 'asc')`

Set the default sort applied in the repository query.

```php-inline
$configuration
    ->setDefaultSort('index', 'title', 'asc')
    ->setField('index', 'Title', Field\TextField::class, [
        'property' => 'title',
        'sort' => ['title', '.title'],
    ]);
```

## setIsSortableCollection

`setIsSortableCollection(string $page, bool $isSortableCollection)`

It enables the drag & drop to sort entities.

```php-inline
class MyEntity implements EntityInterface
{
    // ...

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $sortOrder;

    public function getSortOrder(): ?int
    {
        return $this->sortOrder;
    }

    public function setSortOrder(?int $sortOrder): self
    {
        $this->sortOrder = $sortOrder;

        return $this;
    }

    // ...
}
```

## setSortableCollectionProperty

`setSortableCollectionProperty(string $sortableCollectionProperty)`

In order to sort entities, the default property used is `sortOrder`. You can set something else.

## setBatchAction

`setBatchAction(string $context, string $action, string $label, callable $callack)`

Add a batch action. The callback has 2 arguments:

* An instance of `App\Core\Entity\EntityInterface`
* An instance of `App\Core\Manager\EntityManager`

```php-inline
use App\Core\Entity\EntityInterface;
use App\Core\Manager\EntityManager;

$configuration->setBatchAction(
    'index',
    'delete',
    'Delete',
    function(EntityInterface $entity, EntityManager $manager) {
        $manager->delete($entity);
    }
);
```

## setGlobalBatchAction

`setGlobalBatchAction(string $context, string $action, string $label, callable $callack)`

Add a global batch action. The callback has 3 arguments:

* An instance of `App\Core\Repository\RepositoryQuery`
* An instance of `App\Core\Manager\EntityManager`
* An array of selected entities or a `null` value

Do not use the same action in global and classic batch action.

The callback can return a response. If not, the user will be redirect automatically. See the example below:

```php-inline
use App\Core\Entity\RepositoryQuery;
use App\Core\Manager\EntityManager;
use Symfony\Component\HttpFoundation\JsonResponse;

$configuration->setGlobalBatchAction(
    'index',
    'export_json',
    'Export to JSON',
    function(RepositoryQuery $query, EntityManager $manager, ?array $selection): JsonResponse {
        $items = $selection ?? $query->find();

        return $this->json($items);
    }
);
```
