6

I have a form with assotation field type (list of related entities).

What I've been trying to achieve is to filter this list on "newAction" form (create new entity).

For example, following screen below:

  1. There is a Survey entity with field "User".
  2. There is Department entity with field "Survey" (@ORM\ManyToOne) where the User choose a survey.

You can see two available surveys but I want to display only the first one, because its User field value is the same as current user.

enter image description here

It is confusing, because I can't find values passed to the Survey field when I debuging.

fadehelix
  • 201
  • 2
  • 14

2 Answers2

7

Best way is override default controller and apply query builder for form like this.

YML:-

easy_admin:
    entities:
        Department:
            class: YourBundle\Entity\Department
            controller: YourBundle\Controller\Admin\Model\DepartmentController

In DepartmentController:-

<?php

namespace YourBundle\Controller\Admin\Model;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use JavierEguiluz\Bundle\EasyAdminBundle\Controller\AdminController;

class DepartmentController extends AdminController
{
    public function createDepartmentEntityFormBuilder($entity, $view)
    {
        $formBuilder = parent::createEntityFormBuilder($entity, $view);

        $user = $this->get('security.token_storage')->getToken()->getUser();

        $formBuilder->add('survey', EntityType::class, [
            'class' => 'YourBundle\Entity\Survey',
            'query_builder' => function (EntityRepository $er) {
                return $er->createQueryBuilder('s')
                    ->where('s.user = :user')
                    ->setParameter('user', $user);
            },
        ]);

        return $formBuilder;
    }
}
Maya Shah
  • 950
  • 7
  • 17
  • This works for me, but I need to find a way to render the form as a select2 widget, I made it overriding the EasyAdminAutocomplete behavior, but I wanna do it using the solution proposed above. – rernesto Jan 07 '19 at 16:53
  • Working now, check "vendor/easycorp/easyadmin-bundle/src/Resources/views/default/includes/_select2_widget.html.twig". – rernesto Jan 07 '19 at 16:57
0

My solution:

$formBuilder = parent::createEntityFormBuilder($entity, $view);
    if (!$this->get('security.authorization_checker')->isGranted('ROLE_SUPER_ADMIN')) {
        $user = $this->get('security.token_storage')->getToken()->getUser();
        $promoter = $this->getDoctrine()
            ->getRepository(Promoter::class)
            ->findByUser($user);
        $queryBuilder = $this->getDoctrine()
            ->getRepository(Customer::class)
            ->getActiveByPromoterQueryBuilder($promoter);
        $formBuilder->add(
            'customers', EntityType::class, [
                'class' => Customer::class,
                'query_builder' => $queryBuilder,
                "attr" => ["class" => "form-control select2", "data-widget" => "select2"],
                'by_reference' => false,
                'multiple' => true,
                'required' => false
            ]
        );
    }
    return $formBuilder;
}

According to 'vendor/easycorp/easyadmin-bundle/src/Resources/views/default/includes/_select2_widget.html.twig' We only need to add data-widget attribute.

rernesto
  • 554
  • 4
  • 11