变量有值,但表格显示为空,为什么?

时间:2014-09-14 16:59:44

标签: php forms symfony symfony-forms

我正在使用以下代码编辑对象:

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带有值:

Controller Debug

在另一方面,我做了同样的事情,但是在Twig模板上,我对form var进行了调试,我得到了这个:

Twig Render

现在在这一点上,我很困惑,并提出了两个可能的想法,我希望,有人帮助我发展或至少理解。

  1. 找到一个解决方案,并使用entity我传递给视图的所有信息显示正确的表单。这是理想的,我想为此学习,所以请帮忙吗?
  2. 在控制器中获取Person对象并通过传递Person对象值来创建第二个表单,这应该可行但是我需要在update函数中进行大量更改,因为表单将单独旅行。
  3. 我需要的是在编辑现有NaturalPersonType的任何时候将LegalPersonTypeOrdersType嵌入Orders,因为现在我不知道如何在树枝模板中显示小部件。最后请注意,我在这种情况下谈论的形式是NaturalPersonType呈现但没有值:

    enter image description here

    添加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';
        }
    
    }
    

1 个答案:

答案 0 :(得分:1)

问题出在Type。如您所见,mappedfalse的{​​{1}}选项设置为nat。这意味着 Symfony 不会将这些字段与您的实体相关联,因此在渲染视图时它们是空的。

我猜你是这样做的,因为你的模型中没有这些属性,但你leg。您需要做的是将personNaturalPersonType映射到LegalPersonType

在您的情况下,最简单的方法是使用以下内容替换person OrdersType的最后一行:

buildForm()