EasyAdminBundle 过滤器功能详解

EasyAdminBundle 过滤器功能详解

EasyAdminBundle EasyAdmin is a fast, beautiful and modern admin generator for Symfony applications. EasyAdminBundle 项目地址: https://gitcode.com/gh_mirrors/ea/EasyAdminBundle

过滤器概述

EasyAdminBundle 提供了强大的过滤器功能,允许管理员在后台列表页(index页)中通过表单控件添加查询条件(如 price > 10enabled = true等)来筛选数据。过滤器功能可以显著提升后台管理效率,特别是在处理大量数据时。

基本使用

在 Dashboard 或 CRUD 控制器中,通过 configureFilters() 方法定义过滤器:

namespace App\Controller\Admin;

use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;

class ProductCrudController extends AbstractCrudController
{
    // ...

    public function configureFilters(Filters $filters): Filters
    {
        return $filters
            ->add('title')       // 文本过滤
            ->add('price')      // 数字过滤
            ->add('published')  // 布尔过滤
        ;
    }
}

EasyAdmin 会根据属性数据类型自动选择适当的过滤器类型,但也可以显式指定:

use EasyCorp\Bundle\EasyAdminBundle\Filter\BooleanFilter;

public function configureFilters(Filters $filters): Filters
{
    return $filters
        ->add('title')
        ->add('price')
        ->add(BooleanFilter::new('published'))  // 显式指定布尔过滤器
    ;
}

内置过滤器类型

EasyAdmin 提供了多种内置过滤器,覆盖了常见的过滤需求:

  1. ArrayFilter:用于数组字段,提供等于/不等于条件和选择框
  2. BooleanFilter:用于布尔字段,提供"是"/"否"单选按钮
  3. ChoiceFilter:提供选项选择框
  4. ComparisonFilter:通用复合过滤器,包含两个输入字段
  5. DatetimeFilter:用于日期时间字段,提供条件选择和时间选择器
  6. EntityFilter:用于关联实体字段,提供条件选择和关联实体选择
  7. NullFilter:用于检查属性是否为null,提供"null"/"not null"选项
  8. NumericFilter:用于数字字段,提供数值比较条件和输入框
  9. TextFilter:用于文本字段,提供文本匹配条件和输入框

自定义过滤器

当内置过滤器无法满足需求时,可以创建自定义过滤器。自定义过滤器需要两个类:

  1. 配置类:实现 FilterInterface 接口,负责配置过滤器和应用查询条件
  2. 表单类:实现 FormType 接口,负责渲染HTML控件

自定义过滤器示例

配置类

namespace App\Controller\Admin\Filter;

use App\Form\Type\Admin\DateCalendarFilterType;
use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Filter\FilterInterface;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FilterDataDto;
use EasyCorp\Bundle\EasyAdminBundle\Filter\FilterTrait;

class DateCalendarFilter implements FilterInterface
{
    use FilterTrait;

    public static function new(string $propertyName, $label = null): self
    {
        return (new self())
            ->setFilterFqcn(__CLASS__)
            ->setProperty($propertyName)
            ->setLabel($label)
            ->setFormType(DateCalendarFilterType::class);
    }

    public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void
    {
        if ('today' === $filterDataDto->getValue()) {
            $queryBuilder->andWhere(sprintf('%s.%s = :today', $filterDataDto->getEntityAlias(), $filterDataDto->getProperty()))
                ->setParameter('today', (new \DateTime('today'))->format('Y-m-d'));
        }
        // 其他条件处理...
    }
}

表单类

namespace App\Form\Type\Admin;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class DateCalendarFilterType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'choices' => [
                'Today' => 'today',
                'This month' => 'this_month',
                // 其他选项...
            ],
        ]);
    }

    public function getParent()
    {
        return ChoiceType::class;
    }
}

使用自定义过滤器

public function configureFilters(Filters $filters): Filters
{
    return $filters
        ->add(DateCalendarFilter::new('signupDate'))
    ;
}

非映射过滤器

默认情况下,每个过滤器必须关联到实体的一个属性。如果需要过滤关联实体的属性(如通过客户的country属性过滤订单),需要将mapped选项设为false

public function configureFilters(Filters $filters): Filters
{
    return $filters
        ->add(CustomerCountryFilter::new('country')->setFormTypeOption('mapped', false))
    ;
}

最佳实践

  1. 合理选择过滤器类型:根据数据类型选择合适的过滤器,提升用户体验
  2. 性能考虑:对于大型数据集,避免使用会导致全表扫描的过滤条件
  3. 自定义过滤器:将常用过滤逻辑封装为自定义过滤器,提高代码复用性
  4. 界面友好:为过滤器提供清晰的标签和选项,降低使用门槛

通过合理使用EasyAdminBundle的过滤器功能,可以大幅提升后台管理系统的数据查询效率和用户体验。

EasyAdminBundle EasyAdmin is a fast, beautiful and modern admin generator for Symfony applications. EasyAdminBundle 项目地址: https://gitcode.com/gh_mirrors/ea/EasyAdminBundle

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伍虎州Spirited

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值