我有一个Person
类,其实例为Adress
,因为它们之间的关系为OneToOne
。
来自Employee
的课程extends
Person
。
我有一个Employee的Form(Type)类EmployeeForm
,它为Employee创建表单。
在这种形式中,我添加了一个新的AdressForm
(嵌入的表单)。
我使用form_theme formStyle.html.twig
。
结果如下:
这里是代码:
人:
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.employee
和form.adress
一样?要获得地址标题“Adresse”(可能是底部的提交按钮?)而不调用任何表单元素。