Значения формы пустые (не значения) после рендеринга виджета на форме

У меня есть эта форма:

OrdersType

class OrdersType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Others $builder fields goes here
if ($this->register_type[0] == "natural")
{
$builder->add('person', new NaturalPersonType(), array('label' => FALSE));
}
elseif ($this->register_type[0] == "legal")
{
$builder->add('person', new LegalPersonType(), array('label' => FALSE));
}
}
}

PersonType

class PersonType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('description', 'text', array(
'required' => TRUE,
'label' => FALSE
))
->add('contact_person', 'text', array(
'required' => FALSE,
'label' => 'Persona de Contacto'
));
}
}

Вот что я делаю в контроллере:

public function editAction($id = null)
{
$em = $this->getDoctrine()->getManager();
$order = $em->getRepository('FrontendBundle:Orders')->find($id);
$type = $order->getPerson()->getPersonType() === 1 ? "natural" : "legal";

$orderForm = $this->createForm(new OrdersType(array($type)), $order, array(
'action' => $this->generateUrl('update-order', array('id' => $id)),
'method' => 'POST',
));

return  array(
'entity' => $order,
"form" => $orderForm->createView(),
'id' => $id
);
}

Затем, на мой взгляд, я рендеринг полей следующим образом:

{{ form_widget(form.person.person.description) }}

Код отображает поле правильно, но без значений, и да, у него есть значения, где ошибка? Это другие формы, которые я использую:

LegalPersonType

class LegalPersonType extends AbstractType {

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('rif', 'text', array(
'required' => true,
'label' => false,
'attr' => array(
'maxlength' => 10,
))
)
->add('identification_type', 'choice', array(
'label' => FALSE,
'choices' => RifType::getChoices(),
'attr' => array(
'class' => 'toSelect2'
)
))
->add('person', new PersonType(), array('label' => FALSE));
}
}

Работая над картированием

PersonType

class PersonType extends AbstractType {
....
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Tanane\FrontendBundle\Entity\Person',
'inherit_data' => true
));
}

public function getName()
{
return 'person';
}
}

NaturalPersonType

class NaturalPersonType extends AbstractType {

public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);

$builder
->add('identification_type', 'choice', array(
'label' => 'Número de Cédula',
'choices' => CIType::getChoices()
))
->add('ci', 'number', array(
'required' => true,
'label' => false,
'attr' => array(
'maxlength' => 8,
))
)
->add('person', new PersonType(), array(
'label' => FALSE,
'data_class' => 'Tanane\FrontendBundle\Entity\NaturalPerson'
));
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Tanane\FrontendBundle\Entity\NaturalPerson'
));
}

public function getName()
{
return 'natural_person';
}
}

Если я удалю setDefaultOptions метод из NaturalPersonType Я получаю эту ошибку:

Ожидается, что данные вида формы будут скалярными, массивными или
экземпляр \ ArrayAccess, но является экземпляром класса
Tanane \ FrontendBundle \ Entity \ NaturalPerson. Вы можете избежать этой ошибки
установив опцию «data_class»
«Tanane \ FrontendBundle \ Entity \ NaturalPerson» или путем добавления представления
трансформатор, который преобразует экземпляр класса
Tanane \ FrontendBundle \ Entity \ NaturalPerson для скалярного, массива или
экземпляр \ ArrayAccess.

Если я уйду, как это я получаю это другое:

Метод «description» для объекта «Symfony \ Component \ Form \ FormView» делает
не существует в
/var/www/html/tanane/src/Tanane/BackendBundle/Resources/views/Order/edit.html.twig
на линии 134

1

Решение

Это выглядит как PersonType не отображается правильно на вашу сущность.

Так как он используется как LegalPersonType а также NaturalPersonType чтобы справиться с некоторыми из их свойств, я бы определил его как parent из этих двух. Это может быть достигнуто с помощью inherit_data вариант (документация).

Ваш код будет выглядеть примерно так:

PersonType

class PersonType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('description', 'text', array(
'required' => TRUE,
'label' => FALSE
))
->add('contact_person', 'text', array(
'required' => FALSE,
'label' => 'Persona de Contacto'
));
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'inherit_data' => true,
));
}
}

Обратите внимание, что вы должны удалить data_class вариант из setDefaultOptions(),

LegalPersonType

class LegalPersonType extends AbstractType {

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('rif', 'text', array(
'required' => true,
'label' => false,
'attr' => array(
'maxlength' => 10,
))
)
->add('identification_type', 'choice', array(
'label' => FALSE,
'choices' => RifType::getChoices(),
'attr' => array(
'class' => 'toSelect2'
)
))
->add('data', new PersonType(), array(
'label'      => FALSE,
'data_class' => 'YourBundle\Entity\LegalPerson',
));
}
}

Ваш NaturalPersonType будет выглядеть похоже на LegalPersonType,

Теперь вы можете сделать это по вашему мнению:

{{ form_widget(form.person.data.description) }}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]