Фильтр диапазона дат Сонаты

У меня есть фильтр диапазона дат сонаты

protected function configureDatagridFilters(DatagridMapper $filter)
    {
        $now = new \DateTime();
        $filter
            ->add('created_at', 'doctrine_orm_date_range',  array(
                    'label' => 'created_at_long',
                    'input_type' => 'text',
                    'field_options' => array(
                        'widget' => 'single_text'

                    )
                )
            );
    }

Если я ввожу ту же дату, элементы с этой датой не возвращаются в мой список. Есть ли способ сказать, что соната не использует строгое сравнение и использует операторы «меньше или равно» и «больше или равно»?


person debugall    schedule 26.11.2015    source источник


Ответы (3)


Я думаю, что добавление тега формата ослабит ограничения. В любом случае работает для меня (включительно) со следующим:

'format' => 'dd/MM/yyyy'

Из этого текущего живого/работающего фильтра:

->add('someField', 'doctrine_orm_date_range', [], null, ['format' => 'dd/MM/yyyy', 'widget' => 'single_text'])
person Richard    schedule 26.11.2015
comment
Я добавил тег «формат», и он все еще не работает - person debugall; 26.11.2015
comment
Возможно, есть какая-то проблема с часовым поясом? Я только что проверил это на текущей установке администратора сонаты, и она работает. - person Richard; 26.11.2015

Я думаю, вам следует создать собственный фильтр, расширяющий этот.

  • На первом входе вы устанавливаете время на 0:00
  • на втором входе вы устанавливаете время на 23:59

Еще один способ — использовать метод doctrine_orm_datetime.

Почему

Когда вы смотрите на родительский абстрактный класс Sonata\DoctrineORMAdminBundle\Filter\AbstractDateFilter, вы можете прочитать в методе filter:

 $data['value']['start'] = $data['value']['start'] instanceof \DateTime ? $data['value']['start']->getTimestamp() : 0;
 $data['value']['end'] = $data['value']['end'] instanceof \DateTime ? $data['value']['end']->getTimestamp() : 0;

Это похоже на то, что вы ищете что-то между day/month/year:00:00 и day/month/year:00:00.

Не между day/month/year:00:00 и day/month/year:23:59

person BENARD Patrick    schedule 30.11.2015

проверьте атрибут created_at в объекте и посмотрите его имя, если он createdAt, а created_at — это его имя в БД, поэтому вам нужно изменить его на:

->add('createdAt', 'doctrine_orm_date_range',  array(
                    'label' => 'created_at_long',
                    'input_type' => 'text',
                    'field_options' => array(
                        'widget' => 'single_text'

                    )
                )
            );

потому что администратор сонаты мог отображать атрибут по имени своей БД, но не мог применить к нему фильтр :) надеюсь, это поможет

person Hibatallah Aouadni    schedule 07.10.2016