ich ein Formular mit drei Schichten: Erste Schicht der Behälter für die Spiele ist:Cascade Validation funktioniert nicht auf dritte Schicht eines Formulars
class GameListType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('games', 'collection', array(
'required' => false,
'allow_add' => true,
'prototype' => true,
'by_reference' => false,
'type' => new GameBetType(),
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
parent::setDefaultOptions($resolver);
$resolver->setDefaults(array(
'cascade_validation' => true,
));
}
}
Zweite Schicht ist das Spiel selbst, da ich nicht tun beabsichtigen, das Spiel zu ändern, aber die Wette darauf, es enthält nur die Form für die Wette:
class GameBetType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('bet', new BetType());
}
public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) {
parent::setDefaultOptions($resolver);
$resolver->setDefaults(array(
'data_class' => 'Strego\TippBundle\Entity\Game',
'cascade_validation' => true,
));
}
}
und die dritte Schicht ist die Form für die Wette:
class BetType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('scoreT1' , 'text')
->add('scoreT2' , 'text');
;
}
public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) {
parent::setDefaultOptions($resolver);
$resolver->setDefaults(array(
'data_class' => 'Strego\TippBundle\Entity\Bet',
));
}
}
Das Problem ist, dass, wenn es Validierungseinschränkungen auf der dritten Ebene sind, die Stammform immer gültig ist, aber wenn ich die Wette Einheit speziell bestätigen, ich habe die richtige Verletzung Liste in meinem Controller erhalten:
// Form processing
$form = $this->createForm(new GameListType(), $entity);
$request = $this->getRequest();
if ($request->getMethod() == 'POST') {
$form->bind($request);
$entity = $form->getData();
if ($form->isValid()) {
foreach ($entity->getGames() as $game) {
if($game->hasBet()){
$bet = $game->getBet();
$bet->setUser($user);
$validator = $this->container->get('validator');
$errors = $validator->validate($bet);
var_dump($errors) //<-- i see there are errors
if(count($errors) == 0){
print($bet. ' gets persisted<br>');
$em->persist($bet);
}
}
}
$em->flush();
}
}
Ein weiteres Problem ist, dass, selbst wenn ich $em->persist($bet)
nicht aufrufen, die Entitäten persistiert werden. Ich sehe die in der Zeile
beschriebene Ausgabe nicht, aber der Formulareingang bleibt weiterhin in der Datenbank erhalten.
Also meine zwei Fragen:
Wie kann ich die Fehler, wenn die Validierung fehlschlägt auf die Wette auf das Formular nicht (ich will nicht die ganze Form für ungültig, da konnte es nur 1 von 3 Wetten ist ungültig.
Warum bleibt die Wette bestehen, auch wenn ich nicht
$em-persist($bet)
anrufe, ist das eine Magie, die mit der Bindung passiert?
freundlicherweise zur Verfügung stellen auch die Klasse Abstract – Vineet1982
sein die Symfony2 Standardabstract hinzuzufügen: https://github.com/symfony/symfony/blob/master/src /Symfony/Component/Form/AbstractType.php – m0c