php - Symfony2 LexikFormFilter 捆绑自定义过滤器

标签 php symfony filter

我有一个名为 Product 的实体,具有 name 属性。

例如,对于名为“Red Light Saber”的产品,我希望在输入“Saber”时能够获得结果>过滤器文本字段中的“红色”

但实际上,我需要准确输入“Red Light Saber”才能显示产品。

我正在使用LexikFormFilterBundle 。为了解决我的问题,我尝试按照文档第 iv 节中的说明进行操作。过滤器自定义。

这是我的ProductFilterType.php

<?php

namespace ProjectList\Bundle\ProductBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormBuilder;
use Doctrine\ORM\QueryBuilder;
use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface;

class ProductFilterType extends AbstractType
{
    public $choices;

    public function __construct($providers)
    {
        foreach ($providers as $provider) {
            $this->choices[$provider->getId()] = $provider->getName();
        }
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'filter_text', array('apply_filter' => function (QueryInterface $filterQuery, $field, $values)
            {
                if (empty($values['value'])) {
                    return null;
                }

                $paramName = sprintf('p_%s', str_replace('.', '_', $field));

                // expression that represent the condition
                $expression = $filterQuery->getExpr()->eq($field, ':' . $paramName);
                var_dump($expression);
                die;

                // expression parameters
                $parameters = array($paramName => $values['value']); // [ name => value ]
                // or if you need to define the parameter's type
                // $parameters = array($paramName => array($values['value'], \PDO::PARAM_STR)); // [ name => [value, type] ]

                return $filterQuery->createCondition($expression, $parameters);
            },
            ))
            ->add('description', 'filter_text')
            ->add('type', 'filter_choice', array(
                'choices' => array(0 => 'Gadget', 1 => 'Textile')
            ))
            ->add('provider', 'filter_choice', array(
                'choices' => $this->choices,
            ));

        $listener = function (FormEvent $event) {
            // Is data empty?
            foreach ($event->getData() as $data) {
                if (is_array($data)) {
                    foreach ($data as $subData) {
                        if (!empty($subData)) return;
                    }
                } else {
                    if (!empty($data)) return;
                }
            }

            $event->getForm()->addError(new FormError('Filter empty'));
        };
        $builder->addEventListener(FormEvents::POST_BIND, $listener);
    }

    public function getName()
    {
        return 'projectlist_bundle_entitybundle_productfiltertype';
    }
}

这是我的第 40 行的 var_dump($expression) 结果:

object(Doctrine\ORM\Query\Expr\Comparison)[620]
  protected 'leftExpr' => string 'e.name' (length=6)
  protected 'operator' => string '=' (length=1)
  protected 'rightExpr' => string ':p_e_name' (length=9)

我想我必须将运算符更改为 contain 之类的内容,但我不知道如何操作。

最佳答案

如果您想充当 SQL LIKE 语句,只需执行以下操作:

        ->add('name', 'filter_text', 'filter_text', array('condition_pattern' => FilterOperands::STRING_BOTH));

正如您在 source code here 中看到的那样并描述here in the doc

希望这有帮助

关于php - Symfony2 LexikFormFilter 捆绑自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33259217/

相关文章:

Javascript 在模式 onclick 中显示 anchor 标记标题属性

php - PHP 会自动将数字转换为字符串吗?

mysql - symfony2/doctrine2 dql 其中字段不正确

javascript - 检查输入表单是否为空 jQuery

php - 使用 YAML 替换较小的 SQL 表?

video - ffmpeg:结合 filter_complex 修剪、叠加和连接

php - 如何组织模块化网络应用程序

php - 单击按钮运行 php 函数

android - 如何通过EditText过滤ListView

filter - 无法将过滤后的 Vec 收集到自身中