Sonata如何对当前实体属性进行自动完成过滤

时间:2015-08-11 17:12:59

标签: symfony doctrine-orm autocomplete sonata-admin

我正在使用Sonata Admin Bundle开发一个sf2项目。 该项目是一个用于人道主义任务的捐赠网站。 我有一个'Personne'实体,代表恩人(捐赠者)。

我的问题如下: 我必须使用自动完成功能在奏鸣曲列表视图中过滤结果。 我想使用当前实体的'name'属性('Personne')来过滤结果。

我期待的是:

$datagridMapper
    ->add('personne', 'doctrine_orm_model_autocomplete', 
          array('label' => 'AutoComplete'), 
          null, 
          array('property' => 'name'))

// error output : " The option `association_mapping` must be set for field: `personne` "

您可以在此要点上查看我的完整管理类和实体: https://gist.github.com/chalasr/0658a02b1c04180f5563

我理解这个字段类型是保留给实体关联的(例如我已经通过Personne名称(其他管理类)将它用于我的捐赠实体的过滤结果。

我的问题是: 有可能做我需要的吗? 如果我不能使用这种字段类型,那么实现这项任务的正确方法是什么?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

经过大量测试后,Sonata似乎尚未提供此功能。

所以,我在我的管理控制器中构建了一个自制的自动完成方法,并在我重写的CRUD:list.html.twig模板中将其用作ajax。 此方法将字段名称,其他自动填充字段值和关键字作为参数,并在keyup事件上重新加载结果。

你可以看看这个要点: https://gist.github.com/chalasr/5c27ae64dc596967f18a

如果你有一个想法/命题来优化我的代码($ formMapper的简单自动完成字段类型?),我真的很感兴趣。

答案 1 :(得分:2)

那么可以创建一个选择字段并使用集成的select2来处理自动完成,但我不知道它对大表的好坏。

    $datagridMapper
            ->add('personne','doctrine_orm_callback', array(
            'callback' => array($this, 'filterByName'),
            'field_type' => 'text',
             ), 'entity',array(
                'class' => 'AppBundle\Entity\Personne',
                'choice_label' => 'name'
                    ))

我们添加'doctrine_orm_callback'因为常规字符串过滤器无法处理EntityType字段,所以我们需要自己完成。

public function filterByName($queryBuilder, $alias, $field, $value)
{
       if (!$value['value']) {
        return;
        }   

        $queryBuilder
                ->andWhere($alias . '.name' . ' = ' . ':name' )
                ->setParameter('name' , $value['value']->getName());

        return true;
}

还有一件事,如果下拉框的选择少于10个,select2将不会创建自动完成(搜索)框,因为它在Admin.js中以这种方式设置。

            select.select2({
                width: function(){
                    // Select2 v3 and v4 BC. If window.Select2 is defined, then the v3 is installed.
                    // NEXT_MAJOR: Remove Select2 v3 support.
                    return Admin.get_select2_width(window.Select2 ? this.element : jQuery(this));
                },
                dropdownAutoWidth: true,
                minimumResultsForSearch: 10,
                allowClear: allowClearEnabled
            });

所以你需要覆盖它,如果你想减少它。