【发布时间】:2015-10-21 12:22:32
【问题描述】:
我有一个名为 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';
}
}
这是我的 var_dump($expression) 第 40 行结果:
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 之类的东西,但我不知道该怎么做。
【问题讨论】: