Search code examples
symfonyeasyadmin

easyadmin entity field's dynamic custom choices


Installed easyadminbundle with symfony 4, configured for an entity name Delivery and it has a field associated to another entity name WeeklyMenu:

easy_amin.yaml:

Delivery:
...
      form:
        fields:
          - { property: 'delivered'}
          - { property: 'weeklyMenu', type: 'choice', type_options: { choices: null }}

I need a dynamically filtered results of weeklyMenu entity here, so I can get a list of the next days menus and so on. It's set to null now but have to get a filtered result here.

I've read about overriding the AdminController which I stucked with it. I believe that I have to override easyadmin's query builder that listing an associated entity's result.


Solution

  • i've figured out, here is the solution if someone looking for:

    namespace App\Controller;
    
    use Doctrine\ORM\EntityRepository;
    use EasyCorp\Bundle\EasyAdminBundle\Controller\EasyAdminController;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Symfony\Component\Form\FormBuilder;
    
    class AdminController extends EasyAdminController {
    
      public function createDeliveryEntityFormBuilder($entity, $view) {
        $formBuilder = parent::createEntityFormBuilder($entity, $view);
        $fields = $formBuilder->all();
        /**
         * @var  $fieldId string
         * @var  $field FormBuilder
         */
        foreach ($fields as $fieldId => $field) {
          if ($fieldId == 'weeklyMenu') {
            $options = [
                'attr'     => ['size' => 1,],
                'required' => true,
                'multiple' => false,
                'expanded' => false,
                'class'    => 'App\Entity\WeeklyMenu',
            ];
            $options['query_builder'] = function (EntityRepository $er) {
              $qb = $er->createQueryBuilder('e');
    
              return $qb->where($qb->expr()->gt('e.date', ':today'))
                        ->setParameter('today', new \DateTime("today"))
                        ->andWhere($qb->expr()->eq('e.delivery', ':true'))
                        ->setParameter('true', 1)
                        ->orderBy('e.date', 'DESC');
            };
            $formBuilder->add($fieldId, EntityType::class, $options);
          }
        }
    
        return $formBuilder;
      }
    }
    

    so the easyAdmin check if a formbuilder exists with the entity's name i.e. create<ENTITYNAME>FormBuilder(); and you can override here with your own logic.