texttype symfony2 formtype form_start form createformbuilder php symfony formbuilder

php - form_start - symfony2 formtype



Symfony 2: ¿cómo pasar datos a formBuilder? (6)

Estoy usando la lista de elección de entidades en mi formulario. Quiero usar solo entidades específicas (en ejemplo: solo los grupos a los que pertenece el usuario) Por lo tanto, en el controlador, formBuider estos grupos y trato de pasarlos a formBuider .

Controlador:

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

¿Y ahora qué? cómo usarlo en formBuilder? ¿Cómo cambiar esta línea para usar el conjunto pasado de grupos?

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

o por el otro lado:

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 ; } /.../ }

Entonces, ¿cómo puedo obtener object $ user para usar en el generador de formularios? ($ usuario representa el usuario registrado actual)


La mejor manera (mi opinión) es entregarle a su formulario entityManager y seleccionar todo lo que necesita en él. Pero no olvide declarar la clave vacía en setDefaults (), de lo contrario los datos no pasarán a su constructor.

Algo como este

public function buildForm(FormBuilderInterface $builder, array $options) { $options[''em'']->getRepository(''''); // select all you need $builder->add(''title'', ''text'') ->add(''content'', ''textarea''); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( ''data_class'' => ''Main/BlogBundle/Entity/Post'', ''validation_groups'' => array(''post''), ''required'' => false, ''em'' => null // this var is for your entityManager )); }

Aplica EM como una opción simple ...


La solución de Bacterias es realmente buena. Solo una nota para ahorrarle dolor de cabeza a otro chico como yo :)

En esta parte puedo señalar la parte de use ($company) . Estaba oculto por el marco y, por supuesto, nada funciona correctamente sin él.

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


La solución de las bacterias NO ES buena. Por ejemplo, si declara su tipo como servicio, es imposible pasar un objeto al constructor.

Una solución perfecta son las opciones: simplemente pase los datos como una opción para formar el constructor.


Puede dar el objeto que desea usar en el método __construct ().

P.ej :

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

En tu forma escribe:

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

Y luego, en su formulario, escriba en el método 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); }, ));


Si desea utilizar una consulta personalizada, debe establecer la opción query_builder siguiente manera:

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();

Puede encontrar más información sobre el generador de consultas en el manual de Doctrine y sobre las opciones de entity en el manual de Symfony2 .


//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'' =>'''' )); }