У меня есть коллекция объектов PhoneNumber для каждого объекта Contact (Name, Email). Номер телефона разбит на код города, телефонный номер, суффикс, добавочный номер, а затем селектор типа (Рабочий, Домашний, Мобильный). Я хочу использовать DataTransformer, чтобы число могло отображаться в одном поле формы вместо 4 разных текстовых полей. Телефонные номера не уникальны в базе данных.
ОБНОВЛЕНО: Как получить доступ к полному объекту при преобразовании из строковой версии обратно в объект? Ранее я сталкивался с этой проблемой и в итоге поместил идентификатор объекта в скобки в текстовом поле, а затем повторно выразил их в преобразовании, чтобы я мог выполнить запрос для получения объекта.
phonenumber_combined — это служба пользовательского типа формы, которая ссылается на мой класс PhoneNumberCombinedType.
Мой метод добавления для коллекции телефонов в контакте:
->add('phones', 'collection', array(
'label' => 'Phones',
'type' => new PhoneNumberType(),
'allow_add' => true,
'allow_delete' => true
))
;
Функция сборки PhoneNumberType:
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?
}