Określ różne grupy walidacyjne dla każdego elementu kolekcji w Symfony 2?
[Dokumentacja dotycząca kolekcji] W przypadku osadzania formularzy (typ kolekcji) można określić grupy walidacji dla każdego elementu na podstawie bieżącego elementu? Wydaje się, że nie działa bankomat.
TheTaskType
formularz dodawania kolekcji tagów:
// src/Acme/TaskBundle/Form/Type/TaskType.php
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
// ...
$builder->add('tags', 'collection', array(
// ...
'by_reference' => false,
));
}
Na przykład mamy dwa znaczniki (znacznik 1 i znacznik 2), a nowy znacznik jest dodawany za pomocą przycisku „Dodaj” (poprzez JavaScript):
-----------
| add tag |
-----------
- tag 1 (existing)
- tag 2 (added clicking the "add tag" button)
Tag 1 powinien być zatwierdzony przeciwkoDefault
, Edit
grupy, podczas gdy tag 2 przeciwkoDefault
tylko grupa.
TagType
formularz definiujący dynamiczne grupy walidacyjneW oparciu o dane bazowe, jeśli tag jest nowy, dostajeDefault
grupa, jeśli istniejeDefault
, Create
grupy:
// ...
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function (FormInterface $form) {
$tag = $form->getData();
$groups = array('Default');
if (null !== $tag && null !== $tag->getId()) {
$groups[] = 'Edit';
}
return $groups;
}
));
}
// ...
Tag
encja z ograniczeniem w grupie „Edytuj”Przykład zTag
definiowanie dwóch właściwości (pominięto akcesory):
class Tag
{
/**
* @Assert\NotBlank()
*/
protected $name;
/**
* @Assert\NotBlank(groups={"Edit"})
* @Assert\Length(max="255")
*/
protected $description;
// ...
}
Naistniejący tag: opis nie powinien być pusty. Dlanowy tag: opis może być pusty.
Formularz dowodowy jest ważny, walidator pokazuje błędy (błędne!)Po prostu edytuj istniejący tag i pozostaw pusty opis. Theformularz potwierdza aleUsługa sprawdzania poprawności pokazuje błędy:
$form = $this->createForm('task', $task)
->handleRequest($request);
$validator = $this->get('validator');
if ($form->isValid()) {
foreach ($task->getTags() as $tag) {
// Validate against Default, Edit groups
$errors = $validator->validate($tag, array('Default', 'Edit'));
if (null !== $tag && null !== $tag->getId()) {
echo 'Existing tag #'.$tag->getId();
} else {
echo 'New tag';
}
echo ', errors: '.count($errors).'<br>';
}
die('Form is valid.')
// ...
}
Wydajność:
Existing tag #863, errors: 1
Form is valid.
Aktualizacja 1: Próbowałem (bez powodzenia) metodą statycznądetermineValidationGroups
jak sugerowanotutaj:
public static function determineValidationGroups(FormInterface $form)
{
$groups = array('Default');
if ($form->getData() !== null && null !== $form->getData()->getId())
{
$groups = array('Edit');
}
var_dump($groups);
return $groups;
}
WTagType
Formularz:
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
// ...
'validation_groups' => array(
'Acme\TaskBundle\Entity\Tag',
'determineValidationGroups'
),
));
}
Wydanie tylko jednego istniejącego tagu i jednego utworzonego przy użyciu linku „dodaj tag” wydaje się prawidłowe. Ale nie ma błędów dla istniejącego znacznika pozostawiając pusty opis:
array (size=1)
0 => string 'Edit' (length=4)
array (size=1)
0 => string 'Edit' (length=4)
rray (size=1)
0 => string 'Default' (length=7)
rray (size=1)
0 => string 'Default' (length=7)