Sonata Admin Bundle: 日期选择器范围

25
我该如何在Sonata Admin Bundle中创建一个使用jQuery UI日期选择器的doctrine_orm_datetime_range过滤器?
我尝试了以下代码,但它无效:
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper
        ->add('datumUitgevoerd', 'doctrine_orm_datetime', array('widget' => 'single_text'), null, array('required' => false,  'attr' => array('class' => 'datepicker')))
    ;
}
5个回答

69

现在不再需要使用自定义日期选择器。Sonata包含原生的日期时间选择器,与Twitter Boostrap良好兼容。

要激活日期时间选择器表单字段,您必须启用包含相关代码的twig模板的加载。

配置

对于Symfony 4

# config/packages/twig.yaml
twig:
    # ...
    form_themes:
        - '@SonataCore/Form/datepicker.html.twig'

对于 Symfony 3

# app/config/config.yml
twig:
    # ...
    form_themes:
        - 'SonataCoreBundle:Form:datepicker.html.twig'

对于 Symfony 2

# app/config.yml:
twig:
    # ...
    form:
        resources:
            - 'SonataCoreBundle:Form:datepicker.html.twig'

使用方法

您可以在表单定义中使用选择器:

    use Sonata\CoreBundle\Form\Type\DatePickerType;

    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('createdAt', DatePickerType::class);
    }

在日期时间筛选器中:

    use Sonata\CoreBundle\Form\Type\DatePickerType;

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
                ->add('createdAt', 'doctrine_orm_datetime', ['field_type'=> DatePickerType::class]);
    }

或者作为日期时间范围过滤器:

    use Sonata\CoreBundle\Form\Type\DateTimeRangePickerType;

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
                ->add('createdAt', 'doctrine_orm_datetime_range', ['field_type'=> DateTimeRangePickerType::class]);
    }

旧答案

要在doctrine_orm_datetime中使用datePicker,请使用以下代码:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper->add('datumUitgevoerd', 'doctrine_orm_datetime', array(), null, array('widget' => 'single_text', 'required' => false,  'attr' => array('class' => 'datepicker')));
}

或者在doctrine_orm_datetime_range中使用datePicker,代码应该如下所示:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper->add('datumUitgevoerd', 'doctrine_orm_datetime_range', array(), null, array('widget' => 'single_text', 'required' => false,  'attr' => array('class' => 'datepicker')));
}

你需要重载主模板以添加你的自定义 JavaScript 文件来初始化 DatePicker。

#File app/config.yml
sonata_admin:
    title:      Admin
    title_logo: /logo_admin.png
    templates:
        layout: AcmeDemoBundle::standard_layout.html.twig  
 #...another Sonata and Symfony settings...
{# File src/Acme/Bundle/DemoBundle/Resources/views/standard_layout.html.twig #}
{% extends 'SonataAdminBundle::standard_layout.html.twig' %}

{% block javascripts %}
    {{ parent() }}
    <script src="{{ asset('bundles/acmedemo/js/jquery_admin.js') }}" type="text/javascript"></script>
 {% endblock %}
 //File web\bundles\acmedemo\js\jquery_admin.js
 jQuery(document).ready(function(){
      jQuery.datepicker.setDefaults( jQuery.datepicker.regional[ "" ] );
      jQuery(".datepicker").datepicker( jQuery.datepicker.regional[ "en" ]);
 });

我按照你的指示进行操作,一切都按预期运行直到我点击“筛选”按钮。当选取日期字段时,我会收到一个验证错误,“此值无效”。目前我所做的唯一不同是我使用了 'input_type' => 'timestamp',除此之外都相同。默认的 date_range 小部件对我来说完全正常。有什么想法吗? - Onema
1
解决我的问题的关键是设置正确的格式:'format' => 'M/d/y' - Onema
2
似乎这个解决方案在Symfony 2.6中不再适用了...但是:$datagridMapper->add('expirationDate','doctrine_orm_date_range',['field_type' => 'sonata_type_date_range' , 'field_options'=> array('widget' => 'single_text', 'required' => false, 'attr' => array('class' => 'datepicker'))]);对我很有帮助! - Steven

13

我知道这是一个老话题,但它仍有一定帮助,也许它会在未来帮助到某些人。

我找到了一种设置datepicker日期格式的方法:

$datagridMapper->add('createdAt', 'doctrine_orm_date_range', [
    'field_type'=>'sonata_type_date_range_picker',
    'field_options' => [
        'field_options' => [
            'format' => 'yyyy-MM-dd'
        ]
    ]
]);

默认情况下,该格式参数设置在 Sonata\CoreBundle\Form\Type\DatePickerType 中。


正是我所需要的,你只需要将日期选择器的模板添加到配置文件中即可。 - kunicmarko20
1
对于那些愿意使用 doctrine_orm_datetime_range 的人,格式应该是 'format' => 'yyyy-MM-dd HH:mm:ss' - iloo

5

如果您需要在Symfony 4中使用日期时间范围过滤器

enter image description here

你可以使用:

# config/packages/twig.yml
twig:
    form_themes:
        - '@SonataCore/Form/datepicker.html.twig'

注意: 对于 Sonata 3,您必须使用:

# config/packages/twig.yml
twig:
    form_themes:
        - '@SonataForm/Form/datepicker.html.twig'

管理员类:

use Sonata\CoreBundle\Form\Type\DateTimeRangePickerType;

protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
    $datagridMapper->add(
        'createdAt', 
        'doctrine_orm_datetime_range', [
        'field_type'=> DateTimeRangePickerType::class,
    ]);
}

4

对于 Sonata 3,您必须使用@SonataForm而不是@SonataCore:

# config/packages/twig.yml
twig:
    form_themes:
        - '@SonataForm/Form/datepicker.html.twig'

3
在Symfony 4中,我需要执行以下操作来进行日期时间过滤:

# config/packages/twig.yml
twig:
    form_themes:
        - '@SonataCore/Form/datepicker.html.twig'

在我的管理类中,我需要像这样配置过滤器:

use Sonata\CoreBundle\Form\Type\DateTimePickerType;

...

protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
    $datagridMapper->add('createdAt', 'doctrine_orm_datetime', [
        'field_type'=> DateTimePickerType::class,
    ]);
}

当我们按任何日期筛选一些数据时,这个功能无法正常工作,筛选器会被移除。 - Owais Aslam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接