symfony2 - 嵌入式表单的奇怪渲染(OneToOne关系)

时间:2014-07-12 15:54:44

标签: forms symfony doctrine-orm

我有一个Person类,其实例为Adress,因为它们之间的关系为OneToOne。 来自Employee的课程extends Person。 我有一个Employee的Form(Type)类EmployeeForm,它为Employee创建表单。 在这种形式中,我添加了一个新的AdressForm(嵌入的表单)。 我使用form_theme formStyle.html.twig

结果如下:enter image description here

这里是代码:

人:

class Person 
{
  ... (all the other attributes)
   /**
    * @ORM\OneToOne(targetEntity="Adress")
    * @ORM\JoinColumn(name="adress_id", referencedColumnName="id", nullable=false)
    * @Assert\Type(type="integer")
    * @Assert\NotBlank()
    */
   protected $adress;
   ... (getter and setter)
}

员工:

class Employee extends Person 
{...}

AdressForm:

class AdressForm extends AbstractType 
{
    // set the data class of the form
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'KuMiV\StoreBundle\Entity\Adress',
        ));
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder       
            ->add('street', 'text', array(
                'label' => 'Straße'))
            ->add('number', 'text', array(
                'label' => 'Hausnummer'))
            ->add('city', 'text', array(
                'label'  => 'Stadt'))           
            ->add('zipCode', 'text', array(
                'label' => 'Postleitzahl')) 
            ->add('country', 'text', array(
                'label' => 'Land')) 
            ->add('addInfo', 'text', array(
                'label' => 'Zusatzinformationen', 'required' => false));
    }

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

EmployeeForm:

class EmployeeForm extends AbstractType
{
    // set the data class of the form
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'KuMiV\EmployeeBundle\Entity\Employee',
            'cascade_validation' => true,
        ));
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', 'text', array(
                'label' => 'Titel', 'required' => false))
            ->add('firstName', 'text', array(
                'label' => 'Vorname'))
            ->add('lastName', 'text', array(
                'label'  => 'Nachname'))           
            ->add('gender', 'choice', array(
                'choices' => array('m' => 'männlich', 'f' => 'weiblich')))
            ->add('email', 'email', array(
                'label' => 'Titel', 'required' => false)) 
            ->add('phone1', 'text', array(
                'label' => 'Telefon 1', 'required' => false)) 
            ->add('phone2', 'text', array(
                'label' => 'Telefon 2', 'required' => false))
            ->add('mobile', 'text', array(
                'label' => 'Mobil', 'required' => false))
            ->add('fax', 'text', array(
                'label' => 'Fax', 'required' => false)) 
            ->add('birth', 'text', array(
                'label' => 'Geburtsdatum', 'required' => false))
            ->add('addInfo', 'textarea', array(
                'label' => 'Zusatzinformationen', 'required' => false))
            ->add('adress', new AdressForm())   
            ->add('save', 'submit', array(
                'label' => 'Speichern', 'attr' => array('class' => 'btn btn-success')))
            ->getForm();
    }

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

formStyle.html.twig:

{# app/Resources/views/formStyle.html.twig #}
{% block form_row %}
    <div class="col-md-3">
        <div class="form-group">
            {{ form_label(form) }}
            {{ form_errors(form) }}
            {{ form_widget(form, {'attr' : {'class' : 'form-control'}}) }}
        </div>
    </div>
{% endblock form_row %}

{

newItem.html.twig:

{% extends "base.html.twig" %}
{% form_theme form 'formStyle.html.twig' %}  
...  
{% block pageHeader %} 
    Neuen Mitarbeiter erstellen
{% endblock pageHeader %}

{% block content %}
    <h3 class="sub-header">Personenbezogene Angaben</h3>
    {{ form_start(form, {'attr': {'role': 'form'}}) }}
        <div class="row">   
        </div>
    {{ form_end(form) }}
    <h3 class="sub-header">Adresse</h3>
{% endblock content %}

为什么嵌入的表单呈现为form_row? 是否可以调用员工和地址的表单元素(以一种形式)?与form.employeeform.adress一样?要获得地址标题“Adresse”(可能是底部的提交按钮?)而不调用任何表单元素。

0 个答案:

没有答案