diff --git a/src/Dto/FieldDto.php b/src/Dto/FieldDto.php index f500a11895..a23c4b7e08 100644 --- a/src/Dto/FieldDto.php +++ b/src/Dto/FieldDto.php @@ -54,6 +54,7 @@ final class FieldDto /** @internal */ private $uniqueId; private KeyValueStore $displayedOn; + private array $htmlAttributes = []; public function __construct() { @@ -476,4 +477,23 @@ public function isDisplayedOn(string $pageName): bool { return $this->displayedOn->has($pageName); } + + public function getHtmlAttributes(): array + { + return $this->htmlAttributes; + } + + public function setHtmlAttributes(array $htmlAttributes): self + { + $this->htmlAttributes = $htmlAttributes; + + return $this; + } + + public function setHtmlAttribute(string $attribute, mixed $value): self + { + $this->htmlAttributes[$attribute] = $value; + + return $this; + } } diff --git a/src/Field/FieldTrait.php b/src/Field/FieldTrait.php index 2d7ea5e791..2cd56cfce0 100644 --- a/src/Field/FieldTrait.php +++ b/src/Field/FieldTrait.php @@ -151,6 +151,7 @@ public function setHtmlAttribute(string $attributeName, $attributeValue): self } $this->dto->setFormTypeOption('attr.'.$attributeName, $attributeValue); + $this->dto->setHtmlAttribute($attributeName, $attributeValue); return $this; } diff --git a/src/Resources/views/crud/index.html.twig b/src/Resources/views/crud/index.html.twig index 82383f1925..df490d01f0 100644 --- a/src/Resources/views/crud/index.html.twig +++ b/src/Resources/views/crud/index.html.twig @@ -44,6 +44,12 @@ {%- endapply -%} {% endblock %} +{% macro render_html_attributes(item) %} + {% for attribute_name, attribute_value in item.htmlAttributes %} + {{ attribute_name }}="{{ attribute_value|e('html_attr') }}" + {% endfor %} +{% endmacro %} + {% set has_batch_actions = batch_actions|length > 0 %} {% block page_actions %} {% if filters|length > 0 %} @@ -148,7 +154,7 @@ {% for field in entity.fields %} {% set is_searchable = null == ea.crud.searchFields or field.property in ea.crud.searchFields %} - + {{ include(field.templatePath, { field: field, entity: entity }, with_context = false) }} {% endfor %} diff --git a/tests/Controller/CustomFieldAttributeControllerTest.php b/tests/Controller/CustomFieldAttributeControllerTest.php new file mode 100644 index 0000000000..3f632abf72 --- /dev/null +++ b/tests/Controller/CustomFieldAttributeControllerTest.php @@ -0,0 +1,41 @@ +client->followRedirects(); + $this->client->setServerParameters(['PHP_AUTH_USER' => 'admin', 'PHP_AUTH_PW' => '1234']); + + $this->categories = $this->entityManager->getRepository(Category::class); + } + + public function testItAddsAttributesToTd(): void + { + $crawler = $this->client->request('GET', $this->generateIndexUrl()); + + static::assertCount(20, $crawler->filter('td[multi-test-one="test1"]')); + static::assertCount(20, $crawler->filter('td[multi-test-two="test2"]')); + } +} diff --git a/tests/TestApplication/src/Controller/CustomFieldAttributeCrudController.php b/tests/TestApplication/src/Controller/CustomFieldAttributeCrudController.php new file mode 100644 index 0000000000..c4ee37ffd9 --- /dev/null +++ b/tests/TestApplication/src/Controller/CustomFieldAttributeCrudController.php @@ -0,0 +1,48 @@ +setHtmlAttribute('multi-test-one', 'test1') + ->setHtmlAttribute('multi-test-two', 'test2'), + ]; + } + + public function configureActions(Actions $actions): Actions + { + $action1 = Action::new('action1')->linkToCrudAction(''); + $action2 = Action::new('action2')->linkToCrudAction('')->setCssClass('foo'); + $action3 = Action::new('action3')->linkToCrudAction('')->addCssClass('bar'); + $action4 = Action::new('action4')->linkToCrudAction('')->setCssClass('foo')->addCssClass('bar'); + + return $actions + ->add(Crud::PAGE_INDEX, $action1) + ->add(Crud::PAGE_INDEX, $action2) + ->add(Crud::PAGE_INDEX, $action3) + ->add(Crud::PAGE_INDEX, $action4) + ->update(Crud::PAGE_INDEX, Action::NEW, function (Action $action) { + return $action->setIcon('fa fa-fw fa-plus')->setLabel(false); + }) + ; + } +}