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