padam87/form-filter-bundle

在 Symfony 中构建搜索表单的最简单方式。

安装: 277

依赖者: 1

建议者: 0

安全: 0

星标: 3

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

v0.9.0 2024-08-11 21:16 UTC

README

在 Symfony 中构建搜索表单的最简单方式。

安装

composer require padam87/form-filter-bundle

用法

我的目标是创建一种比目前可用的构建搜索表单的更简单、更轻量级的方法。没有学习曲线,只有简单的抽象。该捆绑包使用内置表单类型,并提供一些额外的过滤器类型以提高便利性。

该捆绑包提供了一个表单类型扩展,并为每个类型提供两个新选项

  • filter bool / callable,默认:true
  • filter_expr 字符串,必须是有效的 doctrine expr,默认:eq

构建表单

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\OptionsResolver\OptionsResolver;

class UserFilterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class)
            ->add('email', TextType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver
            ->setDefaults(
                [
                    'method' => Request::METHOD_GET,
                    'csrf_protection' => false,
                ]
            )
        ;
    }
}

正如你所见,搜索字段使用了内置的 TextType

控制器

$filters = $this->createForm(UserFilterType::class);
$filters->handleRequest($request);

$qb = $em->getRepository(User::class)->createQueryBuilder('alias');

$this->get('padam87_form_filter.filters')->apply($qb, $filters);

// paginate, render template etc.

高级用法

filter_expr - 您可以更改过滤器中使用的表达式,例如在上面的示例中,使用 like 表达式而不是 eq 会更合适。

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, ['filter_expr' => 'like'])
            ->add('email', TextType::class, ['filter_expr' => 'like'])
        ;
    }

filter - 过滤器选项让您完全控制字段的行为。如果简单的表达式不够用,您可以使用回调来自定义过滤器。

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, ['filter_expr' => 'like'])
            ->add('email', TextType::class, ['filter_expr' => 'like'])
            ->add(
                'city',
                TextType::class,
                [
                    'filter' => function(QueryBuilder $qb, $alias, $value) {
                        $qb
                            //->join('u.address', 'a')
                            ->andWhere($qb->expr->eq('a.city', ':city'))
                            ->setParameter('city', $value)
                        ;
                    
                        return $qb;
                    }
                ]
            )
        ;
    }

注意:您在这里不应使用连接,请在存储库中编写自定义方法,例如 getListQb,并在那里连接您需要过滤的所有内容。

过滤器类型

  • BooleanFilterType - 用于布尔值的 3 状态过滤器。 (简单的复选框只有 2 个状态)。
  • RangeFilterType - 用于范围(数字、日期、任何其他)的过滤器
$builder
    ->add(
        'createdAt',
        RangeFilterType::class,
        [
            'from_field_type' => DateType::class,
            'from_field_options' => [
                'widget' => 'single_text',
            ],
            'to_field_type' => DateType::class,
            'to_field_options' => [
                'widget' => 'single_text',
            ],
            'to_field_expr' => 'lt'
        ]
    )
;