【发布时间】:2012-07-12 10:07:34
【问题描述】:
我最近构建了一个DataTransformer,它最终将接受各种不同的日期格式(如 12/12/2012 或 12.12.2012 或 2012-12-12)。
我的问题是:在我将日期和时间分成两个不同的字段之前:
$builder->add('date_end', 'datetime', array(
'label' => 'Date/Time',
'date_widget' => 'single_text',
'time_widget' => 'single_text',
'date_format' => 'dd.MM.yyyy',
'with_seconds' => false,
'required' => false,
) )
效果很好。我如何使用新的DataTransformer 来实现这一点?
在我的实体类型中:
public function buildForm(FormBuilder $builder, array $options) {
builder->add('date_end', 'dateTime', array(
'label' => 'Date/Time',
'required' => false,
) )
}
我创建的对应的DateTimeType:
class DateTimeType extends AbstractType {
private $om;
public function __construct(ObjectManager $om) {
$this->om = $om;
}
public function buildForm(FormBuilder $builder, array $options) {
$transformer = new DateTimeTransformer($this->om);
$builder->appendClientTransformer($transformer);
}
public function getDefaultOptions(array $options) {
return array(
'invalid_message' => 'TODO INVALID',
);
}
public function getParent(array $options) {
return 'text';
}
public function getName(){
return 'dateTime';
}
}
到目前为止我的变压器:
/**
* @param \DateTime|null $dateTime
* @return string|null
*/
public function transform($dateTime) {
if (null === $dateTime) {
return null;
}
return $dateTime->format('Y-m-d H:i');
}
/**
* @param string $value
* @return string|null
*/
public function reverseTransform($value)
{
if ( (null === $value) || empty($value) ) {
return null;
}
return new \DateTime( $value );
}
【问题讨论】:
-
您是否只需将原始的 $builder->add(...) 调用放入新的 buildForm() 方法并将 ->appendClientTransformer($transformer) 附加到它?我不确定我是否完全理解这个问题。
-
当我使用
appendClientTransformer时,整个表单被传递给转换器,我实际上只希望传递必填字段。当我尝试离开选项时,我得到了这个异常:“选项“date_widget”、“time_widget”、“date_format”、“with_seconds”不存在”。我还更新了关于如何调用变压器。 -
那么使用上面的代码,转换被正确应用,只是你的日期字段没有显示为两个小部件?
-
是的,这正是我的问题。
-
你需要一个特定的表单类型,你知道吗?好像您只关心 DataTransformer,但没有显示表单类型。如果你已经有了它,你可以用它来更新问题。