Symfony easyadmin实体字段';用户的动态自定义选择

Symfony easyadmin实体字段';用户的动态自定义选择,symfony,easyadmin,Symfony,Easyadmin,已安装带有symfony 4的easyadminbundle,为实体名称交付配置,并且它有一个与另一个实体名称WeeklyMenu关联的字段: easy_amin.yaml: Delivery: ... form: fields: - { property: 'delivered'} - { property: 'weeklyMenu', type: 'choice', type_options: { choices: null

已安装带有symfony 4的easyadminbundle,为实体名称
交付配置
,并且它有一个与另一个实体名称
WeeklyMenu关联的字段

easy_amin.yaml:

Delivery:
...
      form:
        fields:
          - { property: 'delivered'}
          - { property: 'weeklyMenu', type: 'choice', type_options: { choices: null }}
我需要一个动态筛选的
weeklyMenu
实体的结果,这样我就可以得到接下来几天的菜单列表等等。它现在设置为
null
,但必须在此处获得过滤结果


我已经读过关于重写我用它绊倒的
AdminController
。我认为我必须重写easyadmin的查询生成器,该生成器列出了关联实体的结果。

我发现,如果有人在寻找:

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;
  }
}

因此easyAdmin检查是否存在具有实体名称的formbuilder,即
createFormBuilder()另一种方法是创建新的FormTypeConfigurator并覆盖选项和/或标签。并将其标记为:

App\Form\Type\Configurator\UserTypeConfigurator:
    tags: ['easyadmin.form.type.configurator']
配置程序如下所示: