Skip to content

Commit 404cd06

Browse files
authored
Merge branch '7.x' into bugfix/add-missing-translation-to-the-segment-activity-15575
2 parents bff9e5d + 1b0f768 commit 404cd06

File tree

9 files changed

+692
-17
lines changed

9 files changed

+692
-17
lines changed

.all-contributorsrc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,6 +1652,15 @@
16521652
"contributions": [
16531653
"code"
16541654
]
1655+
},
1656+
{
1657+
"login": "kniziol",
1658+
"name": "Krzysztof Nizioł",
1659+
"avatar_url": "https://avatars.githubusercontent.com/u/947620?v=4",
1660+
"profile": "https://niziol.me",
1661+
"contributions": [
1662+
"code"
1663+
]
16551664
}
16561665
],
16571666
"contributorsPerLine": 7,

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
357357
<td align="center" valign="top" width="14.28%"><a href="https://github.com/naoya-kawakatsu"><img src="https://avatars.githubusercontent.com/u/49386563?v=4?s=100" width="100px;" alt="naoya-kawakatsu"/><br /><sub><b>naoya-kawakatsu</b></sub></a><br /><a href="https://github.com/mautic/mautic/commits?author=naoya-kawakatsu" title="Code">💻</a></td>
358358
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BeniShoga1"><img src="https://avatars.githubusercontent.com/u/197698659?v=4?s=100" width="100px;" alt="Benisyoga"/><br /><sub><b>Benisyoga</b></sub></a><br /><a href="https://github.com/mautic/mautic/commits?author=BeniShoga1" title="Code">💻</a></td>
359359
</tr>
360+
<tr>
361+
<td align="center" valign="top" width="14.28%"><a href="https://niziol.me"><img src="https://avatars.githubusercontent.com/u/947620?v=4?s=100" width="100px;" alt="Krzysztof Nizioł"/><br /><sub><b>Krzysztof Nizioł</b></sub></a><br /><a href="https://github.com/mautic/mautic/commits?author=kniziol" title="Code">💻</a></td>
362+
</tr>
360363
</tbody>
361364
</table>
362365

app/bundles/FormBundle/EventListener/FormValidationSubscriber.php

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Mautic\CoreBundle\Helper\ArrayHelper;
88
use Mautic\CoreBundle\Helper\CoreParametersHelper;
99
use Mautic\FormBundle\Event as Events;
10+
use Mautic\FormBundle\Form\Type\FormFieldCheckboxGroupType;
1011
use Mautic\FormBundle\Form\Type\FormFieldEmailType;
1112
use Mautic\FormBundle\Form\Type\FormFieldTelType;
1213
use Mautic\FormBundle\FormEvents;
@@ -53,6 +54,15 @@ public function onFormBuilder(Events\FormBuilderEvent $event): void
5354
]
5455
);
5556
}
57+
58+
$event->addValidator(
59+
'checkboxgrp.validation',
60+
[
61+
'eventName' => FormEvents::ON_FORM_VALIDATE,
62+
'fieldType' => 'checkboxgrp',
63+
'formType' => FormFieldCheckboxGroupType::class,
64+
]
65+
);
5666
}
5767

5868
/**
@@ -66,6 +76,8 @@ public function onFormValidate(Events\ValidationEvent $event): void
6676
$this->fieldTelValidation($event);
6777
$this->fieldEmailValidation($event);
6878
}
79+
80+
$this->fieldCheckboxGroupValidation($event);
6981
}
7082

7183
private function fieldEmailValidation(Events\ValidationEvent $event): void
@@ -100,4 +112,53 @@ private function fieldTelValidation(Events\ValidationEvent $event): void
100112
}
101113
}
102114
}
115+
116+
private function fieldCheckboxGroupValidation(Events\ValidationEvent $event): void
117+
{
118+
$field = $event->getField();
119+
if ('checkboxgrp' !== $field->getType()) {
120+
return;
121+
}
122+
123+
$value = $event->getValue();
124+
$selectedCnt = 0;
125+
126+
if (!is_array($value)) {
127+
$value = [$value];
128+
}
129+
130+
foreach ($value as $v) {
131+
if ('' !== $v && null !== $v) {
132+
++$selectedCnt;
133+
}
134+
}
135+
136+
$validation = $field->getValidation();
137+
138+
if (!empty($validation['minimum']) && $selectedCnt < (int) $validation['minimum']) {
139+
$message = !empty($validation['min_message'])
140+
? $validation['min_message']
141+
: $this->translator->trans(
142+
'mautic.form.submission.checkboxgrp.minimum',
143+
['%min%' => (int) $validation['minimum']],
144+
'validators'
145+
);
146+
147+
$event->failedValidation($message);
148+
149+
return;
150+
}
151+
152+
if (!empty($validation['maximum']) && $selectedCnt > (int) $validation['maximum']) {
153+
$message = !empty($validation['max_message'])
154+
? $validation['max_message']
155+
: $this->translator->trans(
156+
'mautic.form.submission.checkboxgrp.maximum',
157+
['%max%' => (int) $validation['maximum']],
158+
'validators'
159+
);
160+
161+
$event->failedValidation($message);
162+
}
163+
}
103164
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Mautic\FormBundle\Form\Type;
6+
7+
use Symfony\Component\Form\AbstractType;
8+
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
9+
use Symfony\Component\Form\Extension\Core\Type\TextType;
10+
use Symfony\Component\Form\FormBuilderInterface;
11+
use Symfony\Component\Form\FormError;
12+
use Symfony\Component\Form\FormEvent;
13+
use Symfony\Component\Form\FormEvents;
14+
use Symfony\Component\Validator\Constraints as Assert;
15+
use Symfony\Contracts\Translation\TranslatorInterface;
16+
17+
/**
18+
* @extends AbstractType<mixed>
19+
*/
20+
final class FormFieldCheckboxGroupType extends AbstractType
21+
{
22+
public function __construct(private TranslatorInterface $translator)
23+
{
24+
}
25+
26+
public function buildForm(FormBuilderInterface $builder, array $options): void
27+
{
28+
$builder->add(
29+
'minimum',
30+
IntegerType::class,
31+
[
32+
'label' => 'mautic.form.field.checkboxgrp.minimum',
33+
'label_attr' => ['class' => 'control-label'],
34+
'attr' => [
35+
'class' => 'form-control',
36+
'min' => 0,
37+
],
38+
'required' => false,
39+
'constraints' => [
40+
new Assert\PositiveOrZero(),
41+
],
42+
]
43+
);
44+
45+
$builder->add(
46+
'min_message',
47+
TextType::class,
48+
[
49+
'label' => 'mautic.form.field.checkboxgrp.min_message',
50+
'label_attr' => ['class' => 'control-label'],
51+
'attr' => [
52+
'class' => 'form-control',
53+
'placeholder' => $this->translator->trans('mautic.form.field.checkboxgrp.min_message.placeholder'),
54+
'tooltip' => 'mautic.form.field.checkboxgrp.min_message.tooltip',
55+
],
56+
'required' => false,
57+
'data' => $options['data']['min_message'] ?? null,
58+
]
59+
);
60+
61+
$builder->add(
62+
'maximum',
63+
IntegerType::class,
64+
[
65+
'label' => 'mautic.form.field.checkboxgrp.maximum',
66+
'label_attr' => ['class' => 'control-label'],
67+
'attr' => [
68+
'class' => 'form-control',
69+
'min' => 0,
70+
],
71+
'required' => false,
72+
'constraints' => [
73+
new Assert\PositiveOrZero(),
74+
],
75+
]
76+
);
77+
78+
$builder->add(
79+
'max_message',
80+
TextType::class,
81+
[
82+
'label' => 'mautic.form.field.checkboxgrp.max_message',
83+
'label_attr' => ['class' => 'control-label'],
84+
'attr' => [
85+
'class' => 'form-control',
86+
'placeholder' => $this->translator->trans('mautic.form.field.checkboxgrp.max_message.placeholder'),
87+
'tooltip' => 'mautic.form.field.checkboxgrp.max_message.tooltip',
88+
],
89+
'required' => false,
90+
'data' => $options['data']['max_message'] ?? null,
91+
]
92+
);
93+
94+
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event): void {
95+
$data = $event->getData();
96+
$form = $event->getForm();
97+
98+
if (isset($data['minimum'], $data['maximum']) && '' !== $data['minimum'] && '' !== $data['maximum']) {
99+
if ((int) $data['maximum'] < (int) $data['minimum']) {
100+
$form->get('maximum')->addError(new FormError(
101+
$this->translator->trans('mautic.form.field.checkboxgrp.range.invalid', [], 'validators')
102+
));
103+
}
104+
}
105+
});
106+
}
107+
}

app/bundles/FormBundle/Resources/views/Builder/field.html.twig

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
{% set template = '<div class="col-md-6">{content}</div>' %}
2020
{% set properties = form.properties|default([]) %}
21-
{% set validation = form.validation|default([]) %}
21+
{% set validation = form.validation is defined ? form.validation : null %}
2222

2323
{% set showAttributes = (form.labelAttributes is defined or form.inputAttributes is defined or form.containerAttributes is defined or properties.labelAttributes is defined or form.alias is defined) %}
2424
{% set showBehavior = (form.showWhenValueExists is defined or properties.showWhenValueExists is defined) %}
@@ -156,23 +156,41 @@
156156
{%- if form.isRequired is defined %}<div class="col-md-4">{{ form_row(form.isRequired) }}</div>{% endif %}
157157
{%- if form.validationMessage is defined %}<div class="col-md-8">{{ form_row(form.validationMessage) }}</div>{% endif %}
158158
</div>
159-
<div class="row">
160-
{% for name, property in validation %}
161-
{% if not form.validation[name].isRendered and 'labelAttributes' != name %}
162-
{% if 'hiddin' == form.validation[name].vars.block_prefixes[1] %}
163-
{{ form_row(form.validation[name]) }}
164-
{% else %}
165-
{% set col = 8 %}
166-
{% if 'chocie' == form.validation[name].vars.block_prefixes[1] %}
167-
{% set col = 4 %}
168-
{% endif %}
169-
<div class="col-md-{{ col }}">
170-
{{ form_row(form.validation[name]) }}
171-
</div>
172-
{% endif %}
159+
{% if validation %}
160+
<div class="row">
161+
{% if validation.minimum is defined %}
162+
<div class="col-md-4">{{ form_row(validation.minimum) }}</div>
173163
{% endif %}
174-
{% endfor %}
175-
</div>
164+
{% if validation.min_message is defined %}
165+
<div class="col-md-8">{{ form_row(validation.min_message) }}</div>
166+
{% endif %}
167+
</div>
168+
<div class="row">
169+
{% if validation.maximum is defined %}
170+
<div class="col-md-4">{{ form_row(validation.maximum) }}</div>
171+
{% endif %}
172+
{% if validation.max_message is defined %}
173+
<div class="col-md-8">{{ form_row(validation.max_message) }}</div>
174+
{% endif %}
175+
</div>
176+
<div class="row">
177+
{% for name, property in validation %}
178+
{% if validation[name] is defined and not validation[name].isRendered and 'labelAttributes' != name %}
179+
{% if 'hiddin' == validation[name].vars.block_prefixes[1] %}
180+
{{ form_row(validation[name]) }}
181+
{% else %}
182+
{% set col = 8 %}
183+
{% if 'chocie' == validation[name].vars.block_prefixes[1] %}
184+
{% set col = 4 %}
185+
{% endif %}
186+
<div class="col-md-{{ col }}">
187+
{{ form_row(validation[name]) }}
188+
</div>
189+
{% endif %}
190+
{% endif %}
191+
{% endfor %}
192+
</div>
193+
{% endif %}
176194
</div>
177195
{% endif %}
178196

0 commit comments

Comments
 (0)