具有来自另一个实体的新字段的 Symfony 2.7 表单生成器?
Symfony 2.7 form builder with new field from another entity?
所以我从我的数据库布局开始,我有一个 User
table,其中有一个 accounts_id
link 到另一个 table Accounts
.
里面 Accounts
我有 companyname
。现在我已经为我的用户注册构建了一个 AbstractType。我希望此表单包含 companyname
的字段。但是我尝试过的方法没有用,所以到目前为止我做了什么,
use XBundle\Form\AccountType;
class UserType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('firstname', 'text',['label'=>'Firstname'])
->add('surname', 'text',['label'=>'Surname'])
//->add('companyname','text', ['data_class' => 'XBundle\Entity\Accounts'])
->add('companyname', new AccountType()) <- current attempt
->add('email', 'email',['label'=>'Email'])
->add('password', 'password',['label'=>'Password']);
//->add('confirm', 'password', ['mapped' => false,'label'=>'Re-type password'])
//->add('homepage', 'text',['label'=>'Homepage'])
//->add('save', 'submit', ['label'=>'Register']);
}
public function getName() {
return 'registration';
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'data_class' => 'XBundle\Entity\Users',
'cascade_validation' => true,
]);
}
}
对于我的 AccountType
我有以下内容,
class AccountType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('companyname','text', ['label'=>'Company']);
}
public function getName() {
return 'account';
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'data_class' => 'XBundle\Entity\Accounts',
]);
}
}
当我为我的树枝构建一个 createForm & createView
时(在没有 companyname / AccountType
的情况下渲染没有任何问题)。我收到以下错误,
Neither the property "companyname"
nor one of the methods "getCompanyname()",
"companyname()", "isCompanyname()", "hasCompanyname()",
"__get()" exist and have public access in class "XBundle\Entity\Users"
现在我知道 companyname
在我的 Accounts Entity
中了。我还做了一个测试,以确保我的 AccountType
可以正常工作,方法是构建一个具有该类型的新表单,它可以毫无问题地呈现 Company Name
字段。
但我不确定我做错了什么,或者即使这是在我的用户注册表单上添加另一个实体字段的正确方法,请帮助:)
您收到的错误是预期的。
AccountType
是用于编辑 Account
实体详细信息的表单。通过将 companyname
添加到构建器中,您明确地说 属性 存在 setter 和 getter。这部分是正确的。
UserType
是一种用于编辑 User
实体详细信息的表单,而不是 Account
详细信息。如果您添加一个名为 companyname
的 AccountType
属性,表单组件希望您提供这些方法:
public function getCompanyname() {/*...*/}
public function setCompanyname(Account $account) {/*...*/}
这不是您所期望的,也正是错误所指的内容。
您需要为您的用户实体提供 Account
的访问器,然后定义表单应如何处理它。
选项 1:您想要 select 现有帐户
将此添加到 UserType
构建器:
public function buildForm(FormBuilderInterface $builder, array $options) {
// options are guessed anyway, you choose if set it explicitly or not
$builder->add('account'/*, 'entity', array(
'class' => 'XBundle:Account'
)*/);
}
以及您的 User
实体的以下内容:
class User {
private $account;
public function getAccount() {
return $this->account;
}
public function setAccount(Account $account /* = null, if optional */) {
$this->account = $account;
}
}
选项 2:您想要一对一关联和可编辑的帐户
将此添加到 UserType
构建器:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('account', new AccountType());
}
以及您的 User
实体的以下内容:
class User {
private $account;
public function __construct() {
$this->account = new Account();
}
public function getAccount() {
return $this->account;
}
}
所以我从我的数据库布局开始,我有一个 User
table,其中有一个 accounts_id
link 到另一个 table Accounts
.
里面 Accounts
我有 companyname
。现在我已经为我的用户注册构建了一个 AbstractType。我希望此表单包含 companyname
的字段。但是我尝试过的方法没有用,所以到目前为止我做了什么,
use XBundle\Form\AccountType;
class UserType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('firstname', 'text',['label'=>'Firstname'])
->add('surname', 'text',['label'=>'Surname'])
//->add('companyname','text', ['data_class' => 'XBundle\Entity\Accounts'])
->add('companyname', new AccountType()) <- current attempt
->add('email', 'email',['label'=>'Email'])
->add('password', 'password',['label'=>'Password']);
//->add('confirm', 'password', ['mapped' => false,'label'=>'Re-type password'])
//->add('homepage', 'text',['label'=>'Homepage'])
//->add('save', 'submit', ['label'=>'Register']);
}
public function getName() {
return 'registration';
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'data_class' => 'XBundle\Entity\Users',
'cascade_validation' => true,
]);
}
}
对于我的 AccountType
我有以下内容,
class AccountType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('companyname','text', ['label'=>'Company']);
}
public function getName() {
return 'account';
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'data_class' => 'XBundle\Entity\Accounts',
]);
}
}
当我为我的树枝构建一个 createForm & createView
时(在没有 companyname / AccountType
的情况下渲染没有任何问题)。我收到以下错误,
Neither the property "companyname"
nor one of the methods "getCompanyname()",
"companyname()", "isCompanyname()", "hasCompanyname()",
"__get()" exist and have public access in class "XBundle\Entity\Users"
现在我知道 companyname
在我的 Accounts Entity
中了。我还做了一个测试,以确保我的 AccountType
可以正常工作,方法是构建一个具有该类型的新表单,它可以毫无问题地呈现 Company Name
字段。
但我不确定我做错了什么,或者即使这是在我的用户注册表单上添加另一个实体字段的正确方法,请帮助:)
您收到的错误是预期的。
AccountType
是用于编辑 Account
实体详细信息的表单。通过将 companyname
添加到构建器中,您明确地说 属性 存在 setter 和 getter。这部分是正确的。
UserType
是一种用于编辑 User
实体详细信息的表单,而不是 Account
详细信息。如果您添加一个名为 companyname
的 AccountType
属性,表单组件希望您提供这些方法:
public function getCompanyname() {/*...*/}
public function setCompanyname(Account $account) {/*...*/}
这不是您所期望的,也正是错误所指的内容。
您需要为您的用户实体提供 Account
的访问器,然后定义表单应如何处理它。
选项 1:您想要 select 现有帐户
将此添加到 UserType
构建器:
public function buildForm(FormBuilderInterface $builder, array $options) {
// options are guessed anyway, you choose if set it explicitly or not
$builder->add('account'/*, 'entity', array(
'class' => 'XBundle:Account'
)*/);
}
以及您的 User
实体的以下内容:
class User {
private $account;
public function getAccount() {
return $this->account;
}
public function setAccount(Account $account /* = null, if optional */) {
$this->account = $account;
}
}
选项 2:您想要一对一关联和可编辑的帐户
将此添加到 UserType
构建器:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('account', new AccountType());
}
以及您的 User
实体的以下内容:
class User {
private $account;
public function __construct() {
$this->account = new Account();
}
public function getAccount() {
return $this->account;
}
}