0

I have tree main entity, User, Workgroup and Project. There is a middle entity called Collaboration beetween them. Actually I can provide a form to add a project with users information and workgroups information. I would to filter the workgroup by the connected user in the form.

There is a relation beetween User and Workgroup too, to know who's the owner of the workgroup. (User have One-to-Many on Workgroup and Workgroup have Many-to-one on user)

# MyNiceBundle/Form/Type/CollaborationType.php
class CollaborationType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('project', new ProjectType());
        $builder->add('participant', 'entity', array(
            'class' => 'MyNiceBundle:User',
            'property' => 'email',
            'multiple' => false,
            'expanded' => true
        ));
        $builder->add('workgroup', 'entity', array(
            'class' => 'MyNiceBundle:Workgroup',
            'property' => 'name',
            'multiple' => false,
            'expanded' => true
        ));
    }
}

Thanks in advance.

gperriard
  • 1,077
  • 2
  • 12
  • 22

2 Answers2

0

You can use events to do this. See here: http://symfony.com/doc/master/cookbook/form/dynamic_form_generation.html

Probably on the FormEvents::POST_SET_DATA event you would do something like this...

public function postSetData(DataEvent $event)
{
    $collaboration = $event->getData();
    $form = $event->getForm();
    $user = $collaboration->getParticipant();

    $form->add(
        $this->factory->createNamed('workgroup', 'entity', null, array(
                'class'         => 'MyNiceBundle:Workgroup',
                'required'      => false,
                'query_builder' => function(EntityRepository $er) use ($user) {
                    return $er->getWorkgroupsForUser($user);
                }
            )
        )
    );
}
MDrollette
  • 6,887
  • 1
  • 36
  • 49
  • That's not exactly what I would. I want to sort workgroups by the current logged user. Thanks anyway – gperriard Jun 02 '12 at 13:08
  • Oh, sorry, i misunderstood. In that case you can just pass the User in as an option and use the 'query_builder' option on the entity type. – MDrollette Jun 02 '12 at 15:05
0

This question was answered here " passing data from controller to Type symfony2 "

# MyNiceBundle/Controller/ProjectController.php
// I passed as parameter argument the current logged user to my FormType
$form = $this->createForm(new CollaborationType($this->get('security.context')->getToken()->getUser()), new Collaboration);

# MyNiceBundle/Form/Type/CollaborationType.php
class CollaborationType extends AbstractType
{
    protected $user;

    public function __construct (User $user)
    {
        // Get the logged user
        $this->user = $user;
    }

    public function buildForm(FormBuilder $builder, array $options)
    {
        $user = $this->user;

        $builder->add('project', new ProjectType());
        $builder->add('participant', 'entity', array(
            'class' => 'MyNiceBundle:User',
            'property' => 'email',
            'multiple' => false,
            'expanded' => true
        ));
        // Here I sort workgroup by owner
        $builder->add('workgroup', 'entity', array(
            'class' => 'MyNiceBundle:Workgroup',
            'property' => 'name',
            'multiple' => false,
            'expanded' => true,
            'query_builder' => function(EntityRepository $er) use ($user) {
                return $er->createQueryBuilder('w')
                    ->where("w.owner = :user")
                    ->setParameter('user', $user);
            },
        ));
    }
Community
  • 1
  • 1
gperriard
  • 1,077
  • 2
  • 12
  • 22