Имам колекция от обекти PhoneNumber за всеки обект за контакт (име, имейл). PhoneNumber е разбит на код на област, обмен, суфикс, разширение и след това селектор на тип (работа, дом, мобилен). Искам да използвам DataTransformer, така че числото да може да се показва в едно поле на формуляр вместо в 4 различни текстови полета. Телефонните номера не са уникални в базата данни.
АКТУАЛИЗИРАНО: Как да получа достъп до пълния обект, когато трансформирам от низовата версия обратно към обекта? По-рано се сблъсках с този проблем и в крайна сметка поставих идентификатора на обекта в скоби в текстовото поле и след това ги направих с регекс в трансформацията, за да мога да направя заявка за получаване на обекта.
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);
}
Преобразувател на PhoneNumberToString:
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?
}