Symfony2形式:从另一个实体调用方法



>我有两个实体:用户和人。用户是一个人,在用户实体中,我有一个方法getPerson()。

现在我正在尝试创建一个表单以更改用户配置文件。在那里,我想创建:

$builder->add('degree', 'entity', array(
        'class' => 'SciForumVersion2Bundle:Degree',
        'property' => 'degree',
));
$builder->add('person.firstname', 'text', array('required'=>true));
$builder->add('person.lastname', 'text', array('required'=>true));
$builder->add('person.address1', 'text', array('label'=>'Address', 'required'=>true));
ETC....

在树枝文件中,我必须使用

<tr>
    <td>
        {{ form_label(form.degree) }}
    </td>
    <td>
        {{ form_widget(form.degree) }}
    </td>
</tr>
<tr>
    <td>
    {{ form_label(form.firstname) }}
    </td>
    <td>
        {{ form_widget(form.firstname, { 'attr': {'size': 30} }) }}
    </td>
</tr>
<tr>
    <td>
        {{ form_label(form.lastname) }}
    </td>
    <td>
        {{ form_widget(form.lastname, { 'attr': {'size': 30} }) }}
    </td>
ETC....

但对于

form.firstname
form.firstname

我收到异常:

Method "firstname" for object "SymfonyComponentFormFormView" does not exist in SciForumVersion2Bundle:User:changeProfile.html.twig at line 54 

如果你想在用户表单中显示一个Person表单,你应该看看symfony文档中的嵌入式表单章节。

如果您只想显示 Person 窗体,则代码应该通过从字段名称中删除"person."部分来工作,如下所示:

$builder->add('firstname', 'text', array('required'=>true));
$builder->add('lastname', 'text', array('required'=>true));
$builder->add('address1', 'text', array('label'=>'Address', 'required'=>true));

我设法解决了这个问题。我所做的是我创建了一个额外的实体,称为PersonUserEntity。在那里,我有我需要的所有变量:

degree
firstname
lastname
address1
...ETC...

然后我将此实体用于表单。

提交表单后,我将从该实体获取信息,并分别填充"个人"和"用户"实体。

之后,我正在使用:

$em->persist($person);
$em->flush();
$em->persist($user);
$em->flush();

最新更新