受 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();
}

不幸的是,这也影响了 ModelAutocompleteFilterModelAutocompleteType 结果,也按 '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);
  }

  // ...
}