到目前为止,我已经创建了一个数据转换字符串,但是我真的想尝试扩展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>
<span></span> <i class="fa fa-caret-down"></i>
</div>
答案 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组件的日期格式。