Php Symfony数据转换和使用数据更新表单
两个实体之间存在一对一的关系。第一个是用户实体,第二个是域实体。一个用户可以有多个域 这是用户实体(已删除其他字段,因为与主题无关): 这是UserDomains实体(某些字段已被删除): 必须在向系统注册用户时添加域。我有登记表的登记类型。此类型表单类具有DataTransformer,用于添加注册用户的域 RegisterType类位于此处:Php Symfony数据转换和使用数据更新表单,php,symfony,symfony-forms,Php,Symfony,Symfony Forms,两个实体之间存在一对一的关系。第一个是用户实体,第二个是域实体。一个用户可以有多个域 这是用户实体(已删除其他字段,因为与主题无关): 这是UserDomains实体(某些字段已被删除): 必须在向系统注册用户时添加域。我有登记表的登记类型。此类型表单类具有DataTransformer,用于添加注册用户的域 RegisterType类位于此处: class RegistrationType extends AbstractType { public function buildForm
class RegistrationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('fullName', 'text', array('attr' => array('class' => 'form-control'), 'label' => 'user_register.fullname', 'translation_domain' => 'UsersBundle'))
->add('domains', 'text', array('attr' => array('class' => 'form-control select2', 'id' => 'select2_sample1')))
;
$builder->get('domains')->addModelTransformer(new CallbackTransformer(
function(){
return '';
},
function($data){
$arrCollection = new ArrayCollection();
if (strpos($data, ",") !== false) {
$expData = explode(',', $data);
foreach ($expData as $domain) {
$domainObj = new UserDomains();
$domainObj->setName($domain);
$domainObj->setEnabled(true);
$arrCollection->add($domainObj);
}
} else if (!empty($data)) {
$domain = new UserDomains();
$domain->setName($data);
$domain->setEnabled(true);
$arrCollection->add($domain);
}
return $arrCollection;
}
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MyBundle\Entity\Users',
'intention' => 'registration',
));
}
public function getParent()
{
return 'fos_user_registration';
// Or for Symfony < 2.8
// return 'fos_user_registration';
}
public function getName()
{
return 'user_registration';
}
}
类注册类型扩展了AbstractType
{
公共函数buildForm(FormBuilderInterface$builder、array$options)
{
$builder
->添加('fullName','text',array('attr'=>array('class'=>'form control'),'label'=>'user\u register.fullName','translation\u domain'=>'UsersBundle'))
->添加('domains','text',array('attr'=>array('class'=>'formcontrolselect2','id'=>'select2\u sample1'))
;
$builder->get('domains')->addModelTransformer(新CallbackTransformer(
函数(){
返回“”;
},
功能(数据){
$arrCollection=newarraycollection();
if(strpos($data,“,”)!==false){
$expData=分解(“,”,$data);
foreach($expData作为$domain){
$domainObj=新用户域();
$domainObj->setName($domain);
$domainObj->setEnabled(true);
$arrCollection->add($domainObj);
}
}如果(!empty($data)){
$domain=新用户域();
$domain->setName($data);
$domain->setEnabled(true);
$arrCollection->add($domain);
}
退回$1元;
}
));
}
公共函数配置选项(选项解析器$resolver)
{
$resolver->setDefaults(数组(
“数据\u类”=>“MyBundle\Entity\Users”,
“意向”=>“注册”,
));
}
公共函数getParent()
{
返回“fos_用户注册”;
//或对于Symfony<2.8
//返回“fos_用户注册”;
}
公共函数getName()
{
返回“用户注册”;
}
}
因此,任何人填写登记表并提交。用户创建了域并将其添加到User_domains表中,但不更新必须是新用户id的用户字段。如何自动执行此操作?或者你有没有想法用新用户的id更新用户域的用户列
感谢对所有StackoverFlow的帮助:)向RegistrationType添加如下构造:
class RegistrationType extends AbstractType
{
private $user;
public function __construct(Users $user) {
$this->user = $user;
}
将setUser函数添加到DataTransform中,如下所示:
$domainObj->setUser($this->user);
//and
$domain->setUser($this->user);
$form = $this->createForm(new RegistrationType($userEntity), $userEntity);
最后,按如下方式更新控制器:
$domainObj->setUser($this->user);
//and
$domain->setUser($this->user);
$form = $this->createForm(new RegistrationType($userEntity), $userEntity);
向RegistrationType添加如下构造:
class RegistrationType extends AbstractType
{
private $user;
public function __construct(Users $user) {
$this->user = $user;
}
将setUser函数添加到DataTransform中,如下所示:
$domainObj->setUser($this->user);
//and
$domain->setUser($this->user);
$form = $this->createForm(new RegistrationType($userEntity), $userEntity);
最后,按如下方式更新控制器:
$domainObj->setUser($this->user);
//and
$domain->setUser($this->user);
$form = $this->createForm(new RegistrationType($userEntity), $userEntity);
在User::addDomain add$domain->setUser($this)中;我发现你的问题有点让人困惑,但我想这就是你的要求。这并没有解决我的问题。问题是当用户实体保存时,它必须保存到具有新用户id的UserDomains实体。我认为您的基本方法是有缺陷的。看看表单集合:在User::addDomain add$domain->setUser($this)中;我发现你的问题有点让人困惑,但我想这就是你的要求。这并没有解决我的问题。问题是当用户实体保存时,它必须保存到具有新用户id的UserDomains实体。我认为您的基本方法是有缺陷的。看看表单集合:请注意,这种方法不适用于Symfony 3。如果你真的觉得有必要这样做,那么通过createForm中的options参数传递$user。如果您确实觉得有必要这样做,那么通过createForm中的options参数传递$user。