2013-04-25 2 views
9

У меня есть список элементов типа Vehicle, и я показываю эти элементы с помощью Sonata Admin. Я разрешаю фильтровать эти элементы по полю «статус», но я хочу, чтобы при отображении списка показывались только активные транспортные средства, и если кто-то хочет видеть неактивные транспортные средства, использует фильтр и выбирает неактивный статус. Я хотел бы знать, если кто-то знает способ применения фильтров по умолчанию для списка элементов, использующих Sonata Admin.Symfony2 - Дайте фильтр по умолчанию в списке элементов Sonata Admin

Вот мой код:

public function configureListFields(ListMapper $listMapper) 
{ 
    $listMapper 
     ->addIdentifier('name') 
     ->add('status') 
    ; 
} 

protected function configureDatagridFilters(DatagridMapper $mapper) 
{ 
    $mapper 
     ->add('name') 
     ->add('status') 
    ; 
} 

Есть ли вариант, который может быть добавлен в поле состояния в configureDatagridFilters(), чтобы достичь этой цели? Другие варианты?

Заранее спасибо.

ответ

21

Вы должны переопределить $ datagridValues ​​свойства следующим образом (для статуса> 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'. 
    ); 

Источник: Configure the default page and ordering in the list view

+0

Большое вам спасибо péče !! Я искал информацию в Интернете несколько часов. Я не могу голосовать за ваш ответ, потому что у меня нет достаточной репутации, но я как можно скорее проголосую за ваш ответ. – Airam

+0

Добро пожаловать! Я нашел эту конфигурационную информацию по адресу https://github.com/sonata-project/SonataAdminBundle/blob/master/Resources/doc/reference/advance.rst#configure-the-default-page-and-ordering-in-the -list-view – AlterPHP

+0

Вы, сэр, вы спасли мне головную боль! – Matheno

8

Вы также можете использовать этот метод

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

Использование обоих предложенных подходов приведет к поломке поведения «сброса» фильтров, поскольку мы всегда вынуждаем фильтр фильтровать значение по умолчанию. Для меня, я думаю, что лучший подход состоит в использовании функции getFilterParameters (так как мы можем добавить логику там вместо статически добавить значение) и проверить, если пользователь нажал кнопку «Reset»

/** 
* {@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(); 
} 
+0

Это не хочет работать. Значение находится в моем фильтре, но фильтр не применяется. Если я нажимаю «Фильтр», ничего не происходит, но когда я меняю фильтр, а затем выбираю значение, он работает –

+0

Мне пришлось удалить '' type '=> EqualType :: TYPE_IS_EQUAL' в моем случае –

1

Другой подход использовать createQuery и getPersistentParameters для принудительного применения невидимого фильтра. Этот подход лучше всего иметь полностью настраиваемые фильтры. Смотрите мои статьи здесь:

http://www.theodo.fr/blog/2016/09/sonata-for-symfony-hide-your-filters/