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);
+ })
+ ;
+ }
+}