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/