Symfony 4.如何将DateType扩展为被HiddenType插入

时间:2019-04-12 01:08:56

标签: symfony

到目前为止,我已经创建了一个数据转换字符串,但是我真的想尝试扩展DateType,因为它具有处理日期的所有逻辑,是否有人做过此事,或者我应该只使用DataTransformer(这就是我的意思)已经实施)?

我尝试执行以下操作:

Class HiddenDateType extends DateType {
   public function getParent() {
       return HiddenType::class;
   } 

}

但是这不起作用,当我查看DateType类时,它比我预期的要复杂一些,并且不知道在何处挂接到返回的类型中。

我找到了一些解决方案,但其中大多数解决方案都很笨拙。通过CSS隐藏整个字段,或在树枝模板中更改类型。

这是我的转换器,非常繁琐,令人沮丧的是DateType内有正确的代码,但我的技能却很缺乏:(

class StringToDateTransformer implements DataTransformerInterface
{

    /**
     * @param \DateTime|null $value
     * @return string
     */
    public function transform($value)
    {
        if(null === $value) {
            return '';
        }

        return $value->format('Y-m-d');
    }


    /**
     * @param  string $value
     * @return \DateTime
     */
    public function reverseTransform($value)
    {
        try {
            return new \DateTime($value);
        } catch (\Exception $e) {
            throw new TransformationFailedException(sprintf(
                'Invalid Format for %s format yyyy-mm-dd',
                $value
            ));
        }
    }
}

在实际呈现的页面上,有一个div附加了一个daterangepicker javascript事件(单击),单击该事件将触发该事件,从而允许用户选择开始和结束日期。

然后,JavaScript将在表单中填充两个隐藏的DateType字段(startDate,endDate)。

这是daterangepicker选择器所附加的div。

<div id="selectedRange">
<i class="fa fa-calendar"></i>&nbsp;
<span></span> <i class="fa fa-caret-down"></i>
 </div>

2 个答案:

答案 0 :(得分:0)

您应该能够在formType类buildForm()方法中做到这一点

// ./src/form/yourType.php

$builder->add('hidden_date_field_name', DateType::class, [
  'attr' => [
    'hidden' => 'hidden',
    'disabled' => 'disabled',
  ],
]);

答案 1 :(得分:0)

如果您不打算使用引导时间选择器或输入的任何其他JS修改之类的东西,则使用 DateType DateTimeType 应该没问题。

但是,如果是这种情况,并且您想输入一个更好看的日期输入,那么执行此操作的简单方法是像这样使用它作为字符串:

$builder->add('date', TextType::class, array(
                        'required' => true,
                        'label'=>'Date',
                        'attr' => array(
                            'class'   => 'datetimepicker',
                            'data-provide' => 'datepicker',
                            'data-format' => 'dd-mm-yyyy HH:ii'
                        ),
                    ));

并确保将ModelTransformer添加到FormType的输入中,如下所示:

$builder->get('date')
                    ->addModelTransformer(new StringToDateTransformer());

请注意,您可以在输入属性中指定js组件的日期格式。