【问题标题】:受 getFilterParameters 影响的奏鸣曲 ModelAutocompleteType 结果
【发布时间】:2023-03-30 17:50:02
【问题描述】:

我有一个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();
  }

即使 property 设置为 search,相关的 ModelAutocompleteType 表单字段的结果也将被“状态”字段过滤。

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

【问题讨论】:

    标签: symfony sonata-admin symfony-3.4 sonata symfony-sonata


    【解决方案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, null);
      }
    
      // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-17
      • 2017-04-27
      • 2013-12-04
      • 2015-03-20
      • 2017-04-14
      • 2017-08-09
      • 2018-01-09
      • 2018-03-01
      • 2014-02-04
      相关资源
      最近更新 更多