Переменная имеет значение, но отображение формы пустое, почему?

Я редактирую объект, используя этот код:

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

ladybug_dump_die($order);

$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
);
}

Все там отлично работает, кроме того, что я не знаю / не могу найти, как отобразить объект Person ценности. Если вы посмотрите на картинку, которую я прикрепил здесь, вы заметите, что Person поставляется со значениями:

Отладка контроллера

С другой стороны я сделал то же самое, но на шаблоне Twig, и я делаю отладку на form и я получаю это:

Twig Render

Сейчас я запутался и пришел с двумя возможными идеями, которые, я надеюсь, кто-то поможет мне развить или, по крайней мере, понять.

  1. Найти решение и отобразить правильную форму, используя всю информацию из entity Я перехожу к виду. Это идеал, и я хотел бы поработать над этим, чтобы научиться, так что помогите?
  2. Получить Person объект в контроллере и создать вторую форму, передав Person значения объекта, это должно работать, но их мне понадобится много изменений в update функция, так как формы будут путешествовать отдельно.

Что мне нужно здесь, чтобы получить NaturalPersonType или же LegalPersonType встроенный в OrdersType каждый раз, когда я редактирую существующий Orders потому что сейчас я не знаю, как отобразить виджет в шаблоне ветки. Обратите внимание, что в конце форма, о которой я говорю, в данном случае является NaturalPersonType отображается, но без значений:

введите описание изображения здесь

Добавление OrdersType FormType

class OrdersType extends AbstractType {

/**
* @var string
*/
protected $register_type;

public function __construct($register_type)
{
$this->register_type = $register_type;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nickname', 'text', array(
'required' => FALSE,
'label' => "Nickname/Seudónimo",
'trim' => TRUE,
'attr' => array(
'class' => 'nickname'
)
))
->add('email', 'email', array(
'required' => TRUE,
'label' => "Correo Electrónico",
'trim' => TRUE
))
->add('phone', 'tel', array(
'required' => TRUE,
'label' => 'Números de teléfono (separados por "/")',
'trim' => TRUE,
'default_region' => 'VE',
'format' => PhoneNumberFormat::NATIONAL
))
->add('fiscal_address', 'textarea', array(
'required' => TRUE,
'label' => 'Dirección'
))
->add('shipping_address', 'textarea', array(
'required' => TRUE,
'label' => 'Dirección de Envío'
))
->add('shipping_from', 'choice', array(
'label' => 'Compañía de Encomiendas',
'choices' => SFType::getChoices(),
'empty_value' => '-- SELECCIONAR --'
))
->add('payment_type', 'entity', array(
'class' => 'CommonBundle:PaymentType',
'property' => 'name',
'required' => TRUE,
'label' => 'Forma de Pago',
'empty_value' => '-- SELECCIONAR --'
))
->add('order_amount', 'number', array(
'label' => 'Monto',
'required' => TRUE,
'precision' => 2
))
->add('bank', 'entity', array(
'class' => 'CommonBundle:Bank',
'property' => 'name',
'required' => TRUE,
'label' => 'Banco',
'empty_value' => '-- SELECCIONAR --'
))
->add('transaction', 'text', array(
'required' => TRUE,
'label' => 'No. Transacción'
))
->add('comments', 'textarea', array(
'required' => FALSE,
'label' => 'Comentarios'
))
->add('secure', 'checkbox', array(
'label' => FALSE,
'required' => FALSE,
'value' => 1,
'mapped' => FALSE
))
->add('lives_in_ccs', 'checkbox', array(
'label' => false,
'required' => false,
'mapped' => FALSE,
'value' => 1,
))
->add('suscribe_mail_list', 'checkbox', array(
'label' => FALSE,
'required' => FALSE,
'value' => 1,
'mapped' => FALSE
));

if ($this->register_type[0] == "natural")
{
$builder->add('nat', new NaturalPersonType(), array('mapped' => FALSE));
}
elseif ($this->register_type[0] == "legal")
{
$builder->add('leg', new LegalPersonType(), array('mapped' => FALSE));
}
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Tanane\FrontendBundle\Entity\Orders',
'render_fieldset' => FALSE,
'show_legend' => FALSE,
'intention' => 'orders_form'
));
}

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

}

Добавление NaturalPersonType

<?php

namespace Tanane\FrontendBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Tanane\FrontendBundle\DBAL\Types\CIType;

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('mapped' => FALSE));
}

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

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

}

0

Решение

Проблема в вашем Type, Как видите, mapped опция установлена ​​в false для обоих nat а также leg, Это означает, что Symfony не будет связывать эти поля с вашей сущностью, поэтому они будут пустыми при отображении представления.

Я думаю, вы сделали это таким образом, потому что у вас нет ни одного из этих свойств в вашей модели, но вы делать иметь person, Что вам нужно сделать, это карта NaturalPersonType или же LegalPersonType в person,

Самый простой способ сделать это в вашем случае — заменить последние строки вашего OrdersType«s buildForm() с этим:

    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));
}
1

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

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