Результат Sonata ModelAutocompleteType зависит от параметров getFilter

#symfony #sonata-admin #symfony-3.4 #sonata #symfony-sonata

Вопрос:

У меня есть это поле формы типа 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 на результаты, фильтруя их также по «активному» состоянию, чего я не хотел.

Чтобы решить эту проблему, мне пришлось передать 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);
  }

  // ...
}