加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 将DataTime字段拆分为两个字段

发布时间:2020-12-13 21:50:07 所属栏目:PHP教程 来源:网络整理
导读:我想使用Symfony 2.3将DateTime字段拆分为两个字段(日期和时间).因此,我尝试调整发现 here的Symfony 2.0解决方案,并对Symfony 2.3进行了必要的更改. 新类型: class MyDateTimeType extends AbstractType{ public function buildForm(FormBuilderInterface $
我想使用Symfony 2.3将DateTime字段拆分为两个字段(日期和时间).因此,我尝试调整发现 here的Symfony 2.0解决方案,并对Symfony 2.3进行了必要的更改.

新类型:

class MyDateTimeType extends AbstractType
{
  public function buildForm(FormBuilderInterface $builder,array $options)
  {
    $builder
    ->add('date','date',array(
      'label'  => 'label.form.date','input'  => 'datetime','widget' => 'single_text','format' => 'yyyy-MM-dd','error_bubbling' => true
    ))
    ->add('time','time',array(
      'label'  => 'label.form.time','error_bubbling' => true
    ))
    ->addViewTransformer(new DateTimeToDateTimeArrayTransformer());
  }

  public function getDefaultOptions(array $options)
  {
    return array(
      'label' => 'label.form.date','error_bubbling' => false
    );
  }

  public function getParent()
  {
    return 'form';
  }

  public function getName()
  {
    return 'my_datetime';
  }
}

和DataTransformer:

class DateTimeToDateTimeArrayTransformer implements DataTransformerInterface
{
  public function transform($datetime)
  {
    if ($datetime instanceof DateTime)
    {
      $date = clone $datetime;
      $date->setTime(12,0);

      $time = clone $datetime;
      $time->setDate(1970,1,1);
    }
    else
    {
      $date = null;
      $time = null;
    }

    $result = array(
      'date' => $date,'time' => $time
    );

    return $result;
  }

  public function reverseTransform($array)
  {
    $date = $array['date'];
    $time = $array['time'];

    if(null == $date || null == $time)
      return null;

    $date->setTime($time->format('G'),$time->format('i'));

    return $date;
  }
}

services.yml

foo.bar.form.type.my_date_time:
    class: FooBarFormMyDateTimeType
    tags:
        - { name: form.type,alias: my_datetime }

但是当我在这样的形式中使用类型时:

$builder->add('abc','my_datetime',array(
    'label' => 'ABC','data' => new DateTime(null,new DateTimeZone('UTC'))
));

我收到错误:

表单的视图数据应该是DateTime类的实例,但是我是一个(n)数组.您可以通过将“data_class”选项设置为null或通过添加将(n)数组转换为DateTime实例的视图转换器来避免此错误.

解决方法

我知道有点晚了,但我有同样的问题并解决了它.

您不需要新的表单类型来分割日期时间字段的日期和时间.

在你的形式

$builder
    ->add('datetime',DateTimeType::class,array(
        'date_widget' => 'single_text','time_widget' => 'single_text','date_format' => 'dd.MM.yyyy','required' => true,))
:

如果你想单独渲染输入字段(例如,添加不同的类作为属性),只需在树枝模板中执行此操作

{{ form_start(form) }}
.. 
{{ form_widget(form.datetime.date) }}
{{ form_widget(form.datetime.time) }}
..
{{ form_end(form) }}

在Symfony 2.6中测试,应该从2.3上升(甚至可能是2.1)

编辑:调整为Symfony 2.8及更高版本

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读