Sonata 如何对当前实体进行自动完成筛选 属性
Sonata how make autocomplete filter on current entity property
我正在使用 Sonata Admin Bundle 开发一个 sf2 项目。
该项目是一个用于人道主义使命的捐赠网站。
我有一个 'Personne' 实体,代表捐助者(捐赠者)。
我的问题如下:
我必须使用自动完成功能在奏鸣曲列表视图中过滤结果。
我想使用当前实体 ('Personne') 的 'name' 属性 筛选结果。
我期待什么:
$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` "
您可以在此要点上看到我的完整管理员 class 和实体:
https://gist.github.com/chalasr/0658a02b1c04180f5563
我知道此字段类型保留给实体关联(例如,我已经将其用于按人员姓名(其他管理员 class)过滤我的捐赠实体的结果。
我的问题是:
有可能做我需要的吗?
如果我无法使用此字段类型执行此操作,那么完成此任务的正确方法是什么?
感谢您的帮助。
经过大量测试,Sonata 似乎还没有提供此功能。
因此,我在我的管理控制器中构建了一个自制的自动完成方法,并将其用作我覆盖的 CRUD:list.html.twig 模板中的 ajax。
此方法将字段名称、其他自动完成字段值和关键字作为参数,并在 keyup 事件中重新加载结果。
你可以看看这个要点:
https://gist.github.com/chalasr/5c27ae64dc596967f18a
如果您有 idea/proposition 来优化我的代码($formMapper 的简单自动完成字段类型?),我真的很感兴趣。
好吧,可以创建一个选择字段并使用集成的 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;
}
还有 1 件事,如果下拉框的选项少于 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
});
所以你需要覆盖它,如果你想让它更少。
我正在使用 Sonata Admin Bundle 开发一个 sf2 项目。 该项目是一个用于人道主义使命的捐赠网站。 我有一个 'Personne' 实体,代表捐助者(捐赠者)。
我的问题如下: 我必须使用自动完成功能在奏鸣曲列表视图中过滤结果。 我想使用当前实体 ('Personne') 的 'name' 属性 筛选结果。
我期待什么:
$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` "
您可以在此要点上看到我的完整管理员 class 和实体: https://gist.github.com/chalasr/0658a02b1c04180f5563
我知道此字段类型保留给实体关联(例如,我已经将其用于按人员姓名(其他管理员 class)过滤我的捐赠实体的结果。
我的问题是: 有可能做我需要的吗? 如果我无法使用此字段类型执行此操作,那么完成此任务的正确方法是什么?
感谢您的帮助。
经过大量测试,Sonata 似乎还没有提供此功能。
因此,我在我的管理控制器中构建了一个自制的自动完成方法,并将其用作我覆盖的 CRUD:list.html.twig 模板中的 ajax。 此方法将字段名称、其他自动完成字段值和关键字作为参数,并在 keyup 事件中重新加载结果。
你可以看看这个要点: https://gist.github.com/chalasr/5c27ae64dc596967f18a
如果您有 idea/proposition 来优化我的代码($formMapper 的简单自动完成字段类型?),我真的很感兴趣。
好吧,可以创建一个选择字段并使用集成的 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;
}
还有 1 件事,如果下拉框的选项少于 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 });
所以你需要覆盖它,如果你想让它更少。