[Validation] Comparer 2 champs dans un formulaire
Bonjour,
J'ai besoin de comparer 2 champs date de mon formulaire. Je n'utilise pas d'entité mais des tableaux php.
J'ai une perturbation avec plusieurs impacts. J'ai donc créé 2 types disruptionType et ImpactType
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class DisruptionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'startDate',
'datetime',
array(
'date_widget' => 'single_text',
'time_widget' => 'choice',
'input' => 'string',
'date_format' => 'dd/MM/yyyy',
'required' => false,
'constraints' => array(
new NotBlank(),
)
)
);
$builder->add(
'endDate',
'datetime',
array(
'date_widget' => 'single_text',
'time_widget' => 'choice',
'input' => 'string',
'date_format' => 'dd/MM/yyyy',
'required' => false,
'constraints' => array(
new GreaterThanField(
array(
'field' => 'startDate'
)
),
)
)
);
$builder->add(
'impacts',
'collection',
array(
'type' => 'impact',
'allow_add' => true
)
);
}
public function getName()
{
return 'disruption';
}
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class ImpactType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'startDate',
'datetime',
array(
'date_widget' => 'single_text',
'time_widget' => 'choice',
'input' => 'string',
'date_format' => 'dd/MM/yyyy',
)
);
$builder->add(
'endDate',
'datetime',
array(
'date_widget' => 'single_text',
'time_widget' => 'choice',
'input' => 'string',
'date_format' => 'dd/MM/yyyy',
'required' => false,
'constraints' => array(
new GreaterThanField(
array(
'field' => 'startDate'
)
),
)
)
);
}
public function getName()
{
return 'impact';
}
} |
Pour comparer 2 dates, j'utilise un constraint validator custom où je passe le champs à comparer
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class GreaterThanField extends Constraint
{
public $message = 'this value must be greater than that of the field %field%.';
public $field;
public function getDefaultOption()
{
return 'field';
}
public function getRequiredOptions()
{
return array('field');
}
}
class GreaterThanFieldValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
if (!empty($value) && $value <= $this->context->getRoot()->get($constraint->field)->getData()) {
$this->context->addViolation(
$constraint->message,
array('%field%' => $constraint->field)
);
}
}
} |
Quand je compares 2 dates de la perturbation, le formulaire parent, je n'ai pas de problème. Mais quand il s'agit de comparer les 2 dates de l'impact, ça ne marche pas.
J'ai le message d'erreur suivant.
Citation:
Child "startDate" does not exist.
$this->context->getRoot() retourne le formulaire parent. Je n'ai pas moyen d'avoir le sous-formulaire d'impact et récupérer la valeur de startDate.
ça compare avec la valeur de startDate de la perturbation au lieu de l'impact.
Avez-vous une idée du problème ou y a t-il une meilleure façon de faire?
Merci.