我为每个联系人(姓名、电子邮件)实体收集了电话号码实体。PhoneNumber 分为区号、交换机、后缀、分机,然后是类型选择器(工作、家庭、移动)。我想使用 DataTransformer 以便数字可以显示在单个表单字段中,而不是 4 个不同的文本框中。电话号码在数据库中不是唯一的。
更新:从字符串版本转换回实体时,如何访问完整实体?我之前遇到过这个问题,最终将实体的 ID 放在文本字段中的括号内,然后在转换中将它们正则表达式,以便我可以进行查询以获取实体。
phonenumber_combined 是一个自定义表单类型服务,它引用了我的 PhoneNumberCombinedType 类。
我在联系人中收集电话的添加方法:
->add('phones', 'collection', array(
'label' => 'Phones',
'type' => new PhoneNumberType(),
'allow_add' => true,
'allow_delete' => true
))
;
PhoneNumberType buildForm 函数:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('phone', 'phonenumber_combined')
->add('type', 'entity',
array('class' => 'Test\Bundle\SystemBundle\Entity\Type',
'property' => 'name',
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('type')
->where('type.type = :t')
->orderBy('type.name', 'ASC')
->setParameter('t', 'PhoneNumber');
}))
;
}
PhoneNumberCombinedType 服务:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new PhoneNumberToStringTransformer($this->om);
$builder->addViewTransformer($transformer);
}
电话号码转字符串转换器:
public function transform($phonenumber)
{
if (null === $phonenumber) {
return null;
}
return $phonenumber->__toString();
}
public function reverseTransform($phonenumber)
{
if (!$phonenumber) {
return null;
}
// PHONE NUMBER IS JUST A STRING AT THIS POINT, HOW DO I GET THE ENTITY?
}