在我的symfony 2.7应用程序中,我有基于FOSUserBundle的用户实体.必须连接用户才能访问addAction()表单.
我的用户实体与另一个名为parc的实体链接.这是我的两个实体的代码.
Users.php
class Users extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
$this->parcs = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Parcs", inversedBy="users")
* @ORM\JoinTable(name="users_parcs",
* joinColumns={
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="parc_id", referencedColumnName="id")
* }
* )
*/
private $parcs;
/**
* Get parcs
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getParcs()
{
return $this->parcs;
}
/**
* Set parcs
*
* @return \Doctrine\Common\Collections\Collection
*/
public function setParcs($parcs)
{
return $this->parcs;
}
Parcs.php
class Parcs
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Users", mappedBy="parcs")
*/
private $users;
public function __construct()
{
$this->users = new \Doctrine\Common\Collections\ArrayCollection();
}
//rest of my entity attributes, object, properties etc
// getters and setters
/**
* Get users
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getUsers()
{
return $this->users;
}
/**
* Set users
*
* @return \Doctrine\Common\Collections\Collection
*/
public function setUsers($users)
{
return $this->users;
}
/**
* Add user
*
* @param \MySpace\MyBundle\Entity\Users $user
*
* @return Parcs
*/
public function addUser(\MySpace\MyBundle\Entity\Users $user)
{
$this->users[] = $user;
return $this;
}
使用FOSUserBundle,为了访问连接的用户,在我的树枝视图中,我做了这个:{{app.user.username}},它返回了当前用户的用户名.
现在,当我想添加parc时,我想以我的symfony形式(对于字段用户)检索此值.
这是我的parcsType.php表单:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('parcName')
->add('users')
;
}
这是我在树枝视图中的表单:
<form action="{{ path('addParcs_process') }}" method="POST" {{ form_enctype(form) }}>
<div>
{{ form_label(form.parcName, "Enter the parc name: ", {'label_attr': {'class': 'control-label'}}) }}
{{ form_errors(form.parcName) }}
{{ form_widget(form.parcName) }}
</div>
<div>
{{ form_label(form.users, "Vous ajoutez ce parc en tant que: ", {'label_attr': {'class': 'control-label'}}) }}
{{ form_errors(form.users) }}
{{ form_widget(form.users, {'attr': {'value': app.user.username }}) }}
</div>
<input type="submit" value="Ajouter" class="btn btn-success"/>
</form>
如您所见,我使用{{app.user.username}}设置了我的用户字段的默认值,它可以工作,我的用户字段返回当前用户.但是当我提交表单时,Parcs.php和Users.php之间的用户字段和关联(ManyToMany)不会被持久化/刷新.
这是我的控制器代码:
public function addParcsAction() {
if (!$this->get('security.context')->isGranted('ROLE_EDIT')) {
throw new HttpException("403");
}
$em=$this->getDoctrine()->getManager();
$parc = new Parcs;
$form=$this->createForm(new ParcsType(), $parc);
$form->add('user');
$request = $this->getRequest();
if ($request->isMethod('POST') | ($form->isValid())) {
$form->bind($request);
$currentUser=$this->container->get('security.context')->getToken()->getUser();
$parc->setUsers($currentUser);
$parc = $form->getData();
$em->persist($parc);
$em->flush();
return $this->redirect($this->generateUrl('indexParc'));
}
else {
return $this->render('MySpaceMyBundle:Parcs:addParcs.html.twig', array('form' => $form->createView() ));
}
}
提交工作正常,当我输入parc name的值时,数据在我的数据库中注册,但不是用户值和ManyToMany关联.
最佳答案
在创建表单之前,必须将User对象添加到Parc对象.这样你甚至不需要{‘attr’:{‘value’:app.user.username}}部分.
你能试试这个:
public function addParcsAction() {
if (!$this->get('security.context')->isGranted('ROLE_EDIT')) {
throw new HttpException("403");
}
$em=$this->getDoctrine()->getManager();
$parc = new Parcs;
$currentUser = $this->container->get('security.context')->getToken()->getUser();
$parc->addUser($currentUser);
$form = $this->createForm(new ParcsType(), $parc);
$request = $this->getRequest();
if ($request->isMethod('POST') | ($form->isValid())) {
$form->bind($request);
$parc = $form->getData();
$em->persist($parc);
$em->flush();
return $this->redirect($this->generateUrl('indexParc'));
}
else {
return $this->render('MySpaceMyBundle:Parcs:addParcs.html.twig', array('form' => $form->createView() ));
}
}
这样,您的表单将以当前用户作为用户表单字段中的默认值生成
相关文章
转载注明原文:表单 – 如何在连接用户之后,按照实体之间的ManyToMany关系将默认值设置为symfony表单字段(用户字段) - 代码日志