30 votes

Symfony 2 - comment transmettre des données à formBuilder?

Je suis à l'aide de entity liste de choix de dans mon formulaire. Je veux utiliser uniquement des entités spécifiques (dans l'exemple: seuls les groupes de l'utilisateur appartient) Ainsi, dans le contrôleur, je suis de ces groupes, et en essayant de les faire passer en formBuider.

Contrôleur:

/.../
$groups = $em->getRepository('VendorMyBundle:Group')->getUserGroups($user);
$form = $this->createForm(new Message($groups), $message);
/.../

alors, que faire maintenant? comment l'utiliser dans formBuilder? comment faire pour modifier cette ligne pour utiliser les tableau transmis de groupes?

->add('group','entity',array('class' => 'Vendor\MyBundle\Entity\Group', 'label'=>'Group:'))

ou dans l'autre sens:

class MessageType
{
/.../
  public function buildForm(FormBuilder $builder, array $options)
  {
    $builder
      ->add('group','entity',
        array(
          'class' => 'Vendor\MyBundle\Entity\Group',
          'property' => 'name',
          'query_builder' => function ($repository) {
            $qb = $repository->createQueryBuilder('group');
            $qb->add('where', 'group.administrator = :user');
            $qb->setParameter('user', $user->getId());
            return $qb;
          },
          'label' => 'Group'
        )
      )
      // Continue adding fields
    ;
  }
/.../
}

alors, comment puis-je obtenir de l'objet $user d'utiliser dans le générateur de formulaire? ($utilisateur représentent utilisateur actuellement connecté)

27voto

Bacteries Points 231

Vous pouvez donner l'objet que vous souhaitez utiliser dans la méthode __construct ().

Par exemple :

 $form = $this
    ->get('form.factory')
    ->create(new ApplyStepOneFormType($this->company, $this->ad), $applicant);
 

Dans votre type de formulaire:

 function __construct(\Your\Bundle\Entity\Company $company, \DYB\ConnectBundle\Entity\Ad $ad) {
    $this->company = $company;
    $this->ad = $ad;
}
 

Et puis dans votre formulaire, tapez dans la méthode buildForm:

 $company = $this->company;    
$builder->add('ad', 'entity', array(
    'class' => '\Your\Bundle\Entity\Ad',
    'query_builder' => function(\Your\Bundle\Repository\AdRepository $er) use ($company) {
        return $er->getActiveAdsQueryBuilder($company);
    },
));
 

7voto

user3335780 Points 11
//In controller pass the value which you want to use in builder form in array like

$object = new Question();
$form->create(new QuestionType() , $object , array('sqtname'=>2,'question_type'=>2));


//In Form type class
public function buildForm(FormBuilderInterface $builder , array $options)
    {  
     //for setting data field dynamically 
  if (array_key_exists('question_type', $options) && $options['question_type'] != '') {
    $data = $em->getReference("RecrutOnlineStandardBundle:StdQuestionType",$options['question_type']->getId());
  } else {
    $data = "";
  }


  $builder->add('StdQuestionType', 'entity', array(
        'class' => 'TestStandardBundle:StdQuestionType',
        'property' => 'name',
        'empty_value' => 'Sélectionner un question type',
        'required' => true,
        'data' => $data,
        'query_builder' => function(EntityRepository $er ) use ( $options ) {
            if (isset($options['sqtname']) && $options['sqtname'] != '') {
                return $er->createQueryBuilder('sqt')
                                ->where("sqt.name!= ".$options['sqtname']);
            } else{
               return $er->createQueryBuilder('sqt');
            }
        }
    ));
 }

 public function setDefaultOptions(OptionsResolverInterface $resolver)
     {
       $resolver->setDefaults(array(
         'data_class' => 'Test\QuestionBundle\Entity\Question',
         'required' => false,
         'sqtname' => '',
         'question_type' =>'' 
       ));
     }

2voto

Ondrej Slinták Points 9922

Si vous souhaitez utiliser une requête personnalisée, vous devez définir l'option query_builder comme suit:

 use Doctrine\ORM\EntityRepository;

...

$message = new Message();

$form = $this->createFormBuilder($message)
             ->add('group', 'entity', array(
                   'class' => 'Vendor\MyBundle\Entity\Group',
                   'label'=>'Group:',
                   'query_builder' => function(EntityRepository $er) {
                       return $er->createQueryBuilder('g')
                                 ->... // whatever you want to do
                       }
                    ))
             ->getForm();
 

Vous pouvez trouver plus d'informations sur le générateur de requêtes dans le manuel Doctrine et sur les options pour entity dans le manuel Symfony2 .

2voto

FrançoisGreze Points 21

La solution des bactéries est vraiment bonne. Juste une note pour sauver les maux de tête à un autre gars comme moi :)

Dans cette partie, je voudrais souligner la partie use ($company) . Il était caché par le cadre et bien sûr, rien ne fonctionne correctement sans lui.

 $builder->add('ad', 'entity', array(
   'class' => 
      '\Your\Bundle\Entity\Ad',
   'query_builder' => 
      function(\Your\Bundle\Repository\AdRepository $er) use ($company) {
            return $er->getActiveAdsQueryBuilder($company);
      },
    )
);
 

2voto

nick4fake Points 341

La solution des bactéries n'est PAS une bonne solution. Par exemple, si vous déclarez votre type comme service, il est impossible de passer un objet au constructeur.

Une solution parfaite est les options - il suffit de transmettre les données en option au générateur de formulaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X