jeudi 12 mars 2015

Symfony2.3 - dynamically Generate Forms Based on user Data

I try to struggling through generating a form based on User Data with the help of the [Symfony-Book][1]


The Form appears, but the data doesn't base on the querybuilder and I have no idea, where I'm going wrong. The formular shows all objects of the entity, but not the limited defined in querybuilder


My formtype:



<?php

namespace Pso\ProjectBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Doctrine\ORM\EntityRepository;


class ProjectuserType extends AbstractType
{

private $id;

public function __construct($id)
{$this->id = $id;}

public function buildForm(FormBuilderInterface $builder, array $options)
{

$id = $this->id;

$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($id) {
$form = $event->getForm();

$formOptions = array(
'class' => 'Pso\LogBundle\Entity\User',
'property' => 'username',
'multiple' => 'true',
'expanded' => 'true',
'query_builder' => function (EntityRepository $er) use($id) {
return $er->createQueryBuilder('x')->FROM('PsoProjectBundle:project', 'p')
->JOIN('p.users','u')
->WHERE('p.id <>:id')
->setParameter('id', $id)
;
},
);

$form->add('user', 'entity', $formOptions)
->add('Submit', 'submit', array(
'attr'=> array (
'formnovalidate' => 'formnovalidate'
)
));
}
);
}

public function getName()
{
return 'Projectuser';
}


}


UPDATE:


Now I try to change my query in the builder so that it looks:



<?php

namespace Pso\ProjectBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Doctrine\ORM\EntityRepository;


class ProjectuserType extends AbstractType
{

private $id;

public function __construct($id)
{
$this->id = $id;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{

$id = $this->id;

$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($id) {
$form = $event->getForm();

$formOptions = array(
'class' => 'Pso\LogBundle\Entity\User',
'property' => 'username',
'multiple' => 'true',
'expanded' => 'true',
'query_builder' => function (EntityRepository $er) use($id) {


return $er->createQueryBuilder('x')->SELECT('u')
->FROM('PsoLogBundle:user', 'u')
->JOIN('PsoProjectBundle:project', 'p')
->WHERE('p.id <>:id')
->setParameter('id', $id)
;
},
);


$form->add('user', 'entity', $formOptions)
->add('Submit', 'submit', array(
'attr'=> array (
'formnovalidate' => 'formnovalidate'
)
));
}
);
}

public function getName()
{
return 'Projectuser';
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Pso\LogBundle\Entity\User',
));
}


}


In this case I get the error



[Syntax Error] line 0, col 79: Error: Expected Doctrine\ORM\Query \Lexer::T_WITH, got ','



UPDATE:


Controller:



$form = $this->createFormBuilder()
->add('projectuser', ['except_id' => $id])
->getForm();
$form->handleRequest($request);
$build['form'] = $form->createView();
return $this->render('PsoProjectBundle:Project:editProject.html.twig', array('projects' =>$projects, 'users' =>$users, 'form' => $form->createView(), ));


ProjectuserType.php:



<?php
class ProjectuserType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
\assert(isset($options['except_id']));
$exceptId = $options['except_id'];

$formOptions = [
'class' => User::class, // PHP5.5
'property' => 'username',
'multiple' => 'true',
'expanded' => 'true',
'query_builder' => function (EntityRepository $er) use($exceptId) {
return $er
->createQueryBuilder('u')
->join('u.project', 'p')
->where('p.id <> :id')
->setParameter('id', $exceptId)
;
}
];

$submitOptions = [
'attr'=> [
'formnovalidate' => 'formnovalidate'
]
];


$builder
->add('user', 'entity', $formOptions)
->add('Submit', 'submit', $submitOptions)
;
}

public function getName()
{
return 'Projectuser';
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults([
'data_class' => FormUser::class, // that line is wrong in your code! it must be a class with attributes 'user' and 'submit', see the "builder->add" calls
]);

$resolver->setRequired(['except_id']);
}
}

Aucun commentaire:

Enregistrer un commentaire