受 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','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 表单字段的结果也会被“state”字段过滤。

如何仅将认过滤器值应用于列表视图而不是其他任何内容?为什么 ModelAutocompleteType 结果取决于其他数据网格字段,即使属性设置为 1?

解决方法

最后我留下了 getFilterParameters 方法默认过滤列表,这就是我想要的:

public function getFilterParameters()
{
  $this->datagridValues = array_merge([
    'state' => ['type' => '','value' => 'active']
  ],$this->datagridValues);

  return parent::getFilterParameters();
}

不幸的是,这也影响了 ModelAutocompleteFilterModelAutocompleteType 结果,也通过“活动”状态过滤它们,这是我不想要的。

为了解决我必须将 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);
  }

  // ...
}