Symfony2-дайте фильтр по умолчанию в списке элементов Sonata Admin
У меня есть список элементов типа Vehicle и я показываю эти элементы с Sonata Admin. Я разрешаю фильтровать эти элементы полем "статус", но я хочу, чтобы при отображении списка показывались только активные транспортные средства, и если кто-то хочет видеть неактивные транспортные средства, использует фильтр и выбирает неактивный статус. Я хотел бы знать, знает ли кто-нибудь способ применения фильтров по умолчанию для списка элементов с помощью Sonata Admin.
вот мой код:
public function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('status')
;
}
protected function configureDatagridFilters(DatagridMapper $mapper)
{
$mapper
->add('name')
->add('status')
;
}
есть ли опция, которая может быть добавлена в поле состояния в configureDatagridFilters () для достижения этой цели? Другие варианты?
спасибо заранее.
4 ответов
вы должны переопределить $datagridValues
свойства следующим образом (для status > 0
если это целое число) :
/**
* Default Datagrid values
*
* @var array
*/
protected $datagridValues = array (
'status' => array ('type' => 2, 'value' => 0), // type 2 : >
'_page' => 1, // Display the first page (default = 1)
'_sort_order' => 'DESC', // Descendant ordering (default = 'ASC')
'_sort_by' => 'id' // name of the ordered field (default = the model id field, if any)
// the '_sort_by' key can be of the form 'mySubModel.mySubSubModel.myField'.
);
источник: настройте страницу по умолчанию и порядок в представлении списка
вы также можете использовать этот метод
public function getFilterParameters()
{
$this->datagridValues = array_merge(
array(
'status' => array (
'type' => 1,
'value' => 0
),
// exemple with date range
'updatedAt' => array(
'type' => 1,
'value' => array(
'start' => array(
'day' => date('j'),
'month' => date('m'),
'year' => date('Y')
),
'end' => array(
'day' => date('j'),
'month' => date('m'),
'year' => date('Y')
)
),
)
),
$this->datagridValues
);
return parent::getFilterParameters();
}
использование обоих выше предложенных подходов нарушит поведение фильтров "сброс", так как мы всегда заставляем фильтр фильтровать по умолчанию. Для меня, я думаю, лучший подход-использовать функцию getFilterParameters (так как мы можем добавить логику вместо статического добавления значения) и проверить, нажал ли пользователь кнопку "Сброс"
/**
* {@inheritdoc}
*/
public function getFilterParameters()
{
// build the values array
if ($this->hasRequest()) {
$reset = $this->request->query->get('filters') === 'reset';
if (!$reset) {
$this->datagridValues = array_merge(array(
'status' => array (
'type' => 1,
'value' => 0
),
),
$this->datagridValues
);
}
}
return parent::getFilterParameters();
}
другой подход-использовать createQuery и getPersistentParameters для обеспечения невидимого фильтра. Такой подход лучше всего использовать с полностью настраиваемыми фильтрами. Смотрите мои статьи здесь:
http://www.theodo.fr/blog/2016/09/sonata-for-symfony-hide-your-filters/