#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);
}
// ...
}