Skip to content

Commit 1f2e2f4

Browse files
author
Bjorn Van Acker
authored
Merge pull request #138 from sumocoders/add-min-max-to-collection-items
Add a min and max var to collection types
2 parents fe8ae9f + 0a522e6 commit 1f2e2f4

File tree

4 files changed

+55
-0
lines changed

4 files changed

+55
-0
lines changed

src/Form/Extension/CollectionTypeExtension.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33
namespace SumoCoders\FrameworkCoreBundle\Form\Extension;
44

55
use Symfony\Component\Form\AbstractTypeExtension;
6+
use Symfony\Component\Form\FormEvent;
7+
use Symfony\Component\Form\FormEvents;
68
use Symfony\Component\Form\FormInterface;
79
use Symfony\Component\Form\FormView;
810
use Symfony\Component\OptionsResolver\OptionsResolver;
911
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
12+
use Symfony\Component\Form\FormBuilderInterface;
13+
use Symfony\Component\Form\FormError;
1014

1115
final class CollectionTypeExtension extends AbstractTypeExtension
1216
{
@@ -24,13 +28,57 @@ public function configureOptions(OptionsResolver $resolver): void
2428
[
2529
'allow_drag_and_drop' => true,
2630
'add_button_label' => 'forms.buttons.addItem',
31+
'minimum_required_items' => 0,
32+
'maximum_required_items' => null,
33+
'error_bubbling' => false,
2734
]
2835
);
2936
}
3037

38+
public function buildForm(FormBuilderInterface $builder, array $options): void
39+
{
40+
parent::buildForm($builder, $options);
41+
42+
if ($options['minimum_required_items'] < 0) {
43+
throw new \InvalidArgumentException('minimum_required_items cannot be lower than 0');
44+
}
45+
46+
if ($options['maximum_required_items'] !== null && $options['maximum_required_items'] < $options['minimum_required_items']) {
47+
throw new \InvalidArgumentException('maximum_required_items cannot be lower than minimum_required_items');
48+
}
49+
50+
$builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) {
51+
$form = $event->getForm();
52+
$min = $form->getConfig()->getOption('minimum_required_items');
53+
$max = $form->getConfig()->getOption('maximum_required_items');
54+
55+
if ($form->count() < $min) {
56+
$error = new FormError(
57+
message: 'You must add at least '.$min.' items',
58+
messageTemplate: 'You must add at least %count% items',
59+
messageParameters: ['%count%' => $min]
60+
);
61+
$error->setOrigin($form);
62+
$form->addError($error);
63+
}
64+
65+
if ($max !== null && $form->count() > $max) {
66+
$error = new FormError(
67+
message: 'You can add a maximum of '.$max.' items',
68+
messageTemplate: 'You can add a maximum of %count% items',
69+
messageParameters: ['%count%' => $max]
70+
);
71+
$error->setOrigin($form);
72+
$form->addError($error);
73+
}
74+
});
75+
}
76+
3177
public function buildView(FormView $view, FormInterface $form, array $options): void
3278
{
3379
$view->vars['allow_drag_and_drop'] = $options['allow_drag_and_drop'];
3480
$view->vars['add_button_label'] = $options['add_button_label'];
81+
$view->vars['minimum_required_items'] = $options['minimum_required_items'];
82+
$view->vars['maximum_required_items'] = $options['maximum_required_items'];
3583
}
3684
}

templates/Form/fields.html.twig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
{% set attr = attr|merge({'data-allow-remove': allow_delete ? 1 : 0}) %}
8181
{% set attr = attr|merge({'data-name-prefix': full_name}) %}
8282
{% set attr = attr|merge({'data-role': 'collection'}) %}
83+
{% set attr = attr|merge({'data-min': minimum_required_items, 'data-max': maximum_required_items}) %}
8384

8485
<div
8586
{{ block('widget_container_attributes') }}

translations/validators.en.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@ forms:
22
not_blank: This field is required.
33
url: This is not a valid URL.
44
email: This is not a valid e-mail address.
5+
6+
You can add a maximum of %count% items: You can add a maximum of %count% items.
7+
You must add at least %count% items: You must add at least %count% items.

translations/validators.nl.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@ forms:
22
not_blank: Dit veld is verplicht.
33
url: Dit is geen geldige URL.
44
email: Dit is geen geldige e-mailadres.
5+
6+
You can add a maximum of %count% items: Je kan maximaal %count% items toevoegen.
7+
You must add at least %count% items: Je moet minimaal %count% items toevoegen.

0 commit comments

Comments
 (0)