【问题标题】:easyadmin entity field's dynamic custom choiceseasyadmin 实体字段的动态自定义选择
【发布时间】:2019-06-27 06:20:58
【问题描述】:

使用 symfony 4 安装了 easyadminbundle,为实体名称 Delivery 配置,并且它有一个与另一个实体名称 WeeklyMenu 关联的字段:

easy_amin.yaml:

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

我需要一个weeklyMenu 实体的动态过滤结果,这样我就可以获得接下来几天的菜单列表等等。现在设置为null,但必须在此处获得过滤结果。

我读过关于覆盖我坚持使用的AdminController。我相信我必须覆盖列出关联实体结果的 easyadmin 的查询构建器。

【问题讨论】:

    标签: symfony easyadmin


    【解决方案1】:

    另一种方法是创建新的 FormTypeConfigurator 并覆盖选项和/或标签。并将其标记为:

    App\Form\Type\Configurator\UserTypeConfigurator:
        tags: ['easyadmin.form.type.configurator']
    

    配置器如下所示:

    <?php
    declare(strict_types = 1);
    
    namespace App\Form\Type\Configurator;
    
    use App\Entity\User;
    use EasyCorp\Bundle\EasyAdminBundle\Form\Type\Configurator\TypeConfiguratorInterface;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\FormConfigInterface;
    
    final class UserTypeConfigurator implements TypeConfiguratorInterface
    {
        /**
         * {@inheritdoc}
         */
        public function configure($name, array $options, array $metadata, FormConfigInterface $parentConfig)
        {
            if ($parentConfig->getData() instanceof User) {
                $options['choices'] = User::getUserStatusAvailableChoices();
            }
    
            return $options;
        }
    
        /**
         * {@inheritdoc}
         */
        public function supports($type, array $options, array $metadata)
        {
            return in_array($type, ['choice', ChoiceType::class], true);
        }
    }
    

    【讨论】:

      【解决方案2】:

      我已经想通了,如果有人在寻找,这里是解决方案:

      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 检查是否存在具有实体名称的表单构建器,即create&lt;ENTITYNAME&gt;FormBuilder();,您可以在此处使用自己的逻辑覆盖。

      【讨论】:

        猜你喜欢
        • 2018-11-03
        • 2021-11-21
        • 1970-01-01
        • 1970-01-01
        • 2018-07-21
        • 2015-06-20
        • 2019-01-31
        • 2013-05-15
        • 2012-12-11
        相关资源
        最近更新 更多