2015-11-12 1 views
1

Je construis une forme symfony complexe qui est un peu longue et contient d'autres formes incorporées. Ainsi, le formulaire est affiché dans l'interface utilisateur dans des onglets distincts pour le rendre plus lisible et pratique pour l'utilisateur. Comme le formulaire est long et séparé dans l'interface utilisateur, il est possible que vous ayez manqué quelque chose en le remplissant ou que vous ayez simplement inséré quelque chose de incorrect. C'est à ce moment que la validation intervient et empêche le formulaire d'être sauvegardé. La validation elle-même est configurée et fonctionne parfaitement.Vérifiez si un groupe de validation spécifique est valide dans Symfony Form?

Mon problème ici est que j'ai un formulaire gigantesque, séparé en onglets, qui a une erreur quelque part et j'ai besoin de parcourir chacun des onglets pour voir exactement ce qui est faux. Je pensais à faire cet onglet spécifique, contenant des champs avec des erreurs, dans une autre couleur afin qu'il puisse se démarquer et vous faire gagner du temps de se demander ce qui ne va pas et où il se trouve.

D'après ce que je pouvais voir, j'ai deux options:

  1. Vérifiez tous les champs par onglet, manuellement, en utilisant quelque chose comme:
    {% if not form.children.FIELD_NAME.vars.valid %} qui prendrait une éternité pour terminer et je le ferais que si elle est la seule façon possible.
  2. Essayez d'utiliser validation_groups => array('Default', 'my_tab_name') et regroupez logiquement les champs pour chaque onglet.

Je suis vraiment l'espoir d'utiliser la deuxième méthode, mais je ne peux pas sembler comprendre comment vérifier si le groupe de validation à savoir my_tab_1 contient des erreurs. Je suis conscient que je peux faire quelque chose comme ceci:

$validator = $this->get('validator'); 
$my_tab_1 = $validator->validate($entity, null, array('my_tab_1')); 
$my_tab_2 = $validator->validate($entity, null, array('my_tab_2')); 
$my_tab_3 = $validator->validate($entity, null, array('my_tab_3')); 
// so on 

Mais la forme est déjà en cours de validation avec $form->validate() et en utilisant cette approche déclencherait N plus inutiles validations.

Donc la question ici est de savoir comment vérifier si un groupe de validation spécifique est valide à partir d'un modèle de brindille? Si ce n'est pas possible, peut-on l'obtenir du Controller et le passer comme variable sans faire encore une autre validation?

Je ne pense pas que je devrais poster le FormType s parce qu'ils sont longs, imbriqués et pourraient ne vous rendre confus. Cependant, ceci est une version simplifiée du formulaire parent:

class CompanyType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('address') 
      ->add('representedBy') 
      ->add('category') 
      ->add('phone') 
      ->add('member', new MemberType()) 
      ->add('contacts', new ContactType()) 
      ->add('notes', new NoteType()) 
      // and a couple more embedded form types. 
     ; 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'App\FooBundle\Entity\Company', 
      'cascade_validation' => true 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'app_company'; 
    } 
} 

Si quelqu'un a une meilleure idée ou d'une solution, je l'apprécie vraiment.

+0

Jetez un oeil à craueformflowbundle: https://github.com/craue/CraueFormFlowBundle –

Répondre

1

D'abord, vous pouvez utiliser les onglets de deux façons différentes:

a) Avec javascript. Tout le contenu des onglets est chargé une fois et peut être trouvé dans la source de la page. Tout le contenu de l'onglet est caché sauf un.

b) Avec liens et PHP. Dans ce cas, chaque onglet est une autre page Web avec une autre URL.

(espérons-vous comprendre la différence)

J'utilise toujours la deuxième méthode pour mes formes avancées. Ainsi, pour chaque page, je n'ajoute qu'une partie de tous les champs de formulaire dans le formulaire. Pour chaque page j'utilise un groupe de validation aussi. C'est déjà suffisant pour EDITER les entités existantes.

Mais un problème est une nouvelle entité. Vous souhaiterez peut-être éviter les entités partiellement remplies dans votre base de données, vous devez donc valider et stocker chaque «étape» de la session et une fois que l'utilisateur a terminé la dernière étape (la validation étant correcte), vous pouvez stocker tous les formulaires. champs en une fois dans la base de données.

Cette méthode est utilisée par le craueformflowbundle.

Pour obtenir une partie de vos champs de formulaire, utilisez simplement un commutateur dans votre formulaireType ou créez un formulaire pour chaque étape.

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class CompanyType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     switch ($options['flow_step']) { 
      case 1: 
       $builder 
        ->add('company') 
        ->add('origin') 
       ; 
       break; 
      case 2: 
       $builder 
        ->add('contactPerson', NULL, array('label' => 'Volledige naam')) 
        ->add('email', 'email', array('label' => 'Email')) 
        ->add('telephone', NULL, array('label' => 'Telefoonnummer')) 
       ; 
       break; 
     } 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Company', 
      'flow_step' => 1 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'appbundle_company'; 
    } 
} 
+0

Merci pour cette suggestion. Malheureusement, je ne peux pas séparer le formulaire en étapes, car il existe une logique métier derrière le formulaire qui effectue une validation de formulaire supplémentaire basée sur des règles métier. – tftd