# 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: `{{ configuration.pageTitle('index') }}`. ## 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: `...`. ## 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('%s', $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); } ); ```