受 getFilterParameters 影响的 Sonata ModelAutocompleteType 结果
Sonata ModelAutocompleteType result affected by getFilterParameters
我有一个 ModelAutocompleteType
类型的表单字段,它应该显示相关管理员的“搜索”数据网格字段过滤的结果:
class OperationAdmin extends AbstractAdmin
{
// ...
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('business', ModelAutocompleteType::class, [
'label' => 'Business',
'property' => 'search'
]);
}
// ...
}
在这个相关的“业务”管理员中,我有几个过滤器定义为:
class BusinessAdmin extends AbstractAdmin
{
// ...
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('search', CallbackFilter::class, [
'label' => 'Search',
'show_filter' => true,
'advanced_filter' => false,
'callback' => function($qb, $alias, $field, $value) {
if (!$value['value']) return;
// ...
return true;
}
])
->add('state', ChoiceFilter::class, [
'label' => 'State',
'show_filter' => true,
'advanced_filter' => false,
'field_options' => ['choices' => Business::STATES],
'field_type' => 'choice'
]);
}
// ...
}
现在,如果我使用 getFilterParameters
设置默认的“状态”数据网格字段值,以便在初始页面加载时按状态过滤业务列表:
public function getFilterParameters()
{
$this->datagridValues = array_merge([
'state' => ['type' => '', 'value' => 'active']
], $this->datagridValues);
return parent::getFilterParameters();
}
相关的 ModelAutocompleteType
表单字段的结果也将被“状态”字段过滤,即使它的 property
设置为 search
。
如何仅将默认过滤器值应用于列表视图而不应用于其他?为什么 ModelAutocompleteType
结果取决于其他数据网格字段,即使 属性 设置为 1?
最后我把getFilterParameters
方法留在默认过滤列表中,这就是我想要的:
public function getFilterParameters()
{
$this->datagridValues = array_merge([
'state' => ['type' => '', 'value' => 'active']
], $this->datagridValues);
return parent::getFilterParameters();
}
不幸的是,这也影响了 ModelAutocompleteFilter
和 ModelAutocompleteType
结果,也按 'active' 状态过滤了它们,这是我不想要的。
为了解决这个问题,我必须将 callback
属性 传递给 ModelAutocompleteType
字段,以重置数据网格状态值:
class OperationAdmin extends AbstractAdmin
{
// ...
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('business', ModelAutocompleteType::class, [
'label' => 'Business',
'property' => 'search',
'callback' => [$this, 'filterAllBusinessesCallback']
]);
}
public function filterAllBusinessesCallback(AdminInterface $admin, $property, $value)
{
$datagrid = $admin->getDatagrid();
$datagrid->setValue($property, null, $value);
$datagrid->setValue('state', null, null);
}
// ...
}
我有一个 ModelAutocompleteType
类型的表单字段,它应该显示相关管理员的“搜索”数据网格字段过滤的结果:
class OperationAdmin extends AbstractAdmin
{
// ...
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('business', ModelAutocompleteType::class, [
'label' => 'Business',
'property' => 'search'
]);
}
// ...
}
在这个相关的“业务”管理员中,我有几个过滤器定义为:
class BusinessAdmin extends AbstractAdmin
{
// ...
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('search', CallbackFilter::class, [
'label' => 'Search',
'show_filter' => true,
'advanced_filter' => false,
'callback' => function($qb, $alias, $field, $value) {
if (!$value['value']) return;
// ...
return true;
}
])
->add('state', ChoiceFilter::class, [
'label' => 'State',
'show_filter' => true,
'advanced_filter' => false,
'field_options' => ['choices' => Business::STATES],
'field_type' => 'choice'
]);
}
// ...
}
现在,如果我使用 getFilterParameters
设置默认的“状态”数据网格字段值,以便在初始页面加载时按状态过滤业务列表:
public function getFilterParameters()
{
$this->datagridValues = array_merge([
'state' => ['type' => '', 'value' => 'active']
], $this->datagridValues);
return parent::getFilterParameters();
}
相关的 ModelAutocompleteType
表单字段的结果也将被“状态”字段过滤,即使它的 property
设置为 search
。
如何仅将默认过滤器值应用于列表视图而不应用于其他?为什么 ModelAutocompleteType
结果取决于其他数据网格字段,即使 属性 设置为 1?
最后我把getFilterParameters
方法留在默认过滤列表中,这就是我想要的:
public function getFilterParameters()
{
$this->datagridValues = array_merge([
'state' => ['type' => '', 'value' => 'active']
], $this->datagridValues);
return parent::getFilterParameters();
}
不幸的是,这也影响了 ModelAutocompleteFilter
和 ModelAutocompleteType
结果,也按 'active' 状态过滤了它们,这是我不想要的。
为了解决这个问题,我必须将 callback
属性 传递给 ModelAutocompleteType
字段,以重置数据网格状态值:
class OperationAdmin extends AbstractAdmin
{
// ...
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('business', ModelAutocompleteType::class, [
'label' => 'Business',
'property' => 'search',
'callback' => [$this, 'filterAllBusinessesCallback']
]);
}
public function filterAllBusinessesCallback(AdminInterface $admin, $property, $value)
{
$datagrid = $admin->getDatagrid();
$datagrid->setValue($property, null, $value);
$datagrid->setValue('state', null, null);
}
// ...
}