easyadmin 实体字段的动态自定义选择

Posted

技术标签:

【中文标题】easyadmin 实体字段的动态自定义选择【英文标题】:easyadmin entity field's dynamic custom choices 【发布时间】: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 的查询构建器。

【问题讨论】:

【参考方案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();,您可以在此处使用自己的逻辑覆盖。

【讨论】:

以上是关于easyadmin 实体字段的动态自定义选择的主要内容,如果未能解决你的问题,请参考以下文章

自定义嵌套表单类型 easyadmin

如何在 EasyAdmin 3 中添加自定义操作?

Spring REST API,响应中的自定义实体字段

EasyAdmin 添加自定义 Web 资产

WooCommerce 中的动态同步自定义结帐选择字段

有没有办法在 EasyAdmin 3 中表示 JSON 字段?