W mojej aplikacji Symfony 2.7, mam jednostkę użytkownika opartą na FOSUserBundle. Użytkownik musi być podłączony, aby uzyskać dostęp do formularza addAction().jak ustawić wartość domyślną do pola formularza symfony (pole użytkownika) po podłączonym użytkowniku, zgodnie z relacją ManyToMany pomiędzy jednostkami
Moja jednostka użytkownika jest powiązana z inną jednostką o nazwie parc. To jest kod moich dwóch bytów.
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;
}
Używanie FOSUserBundle, w celu uzyskania dostępu do podłączonego użytkownika, moim zdaniem gałązka robię tak: {{ app.user.username }}
, która przywraca mi nazwę użytkownika bieżącego użytkownika.
Teraz chciałbym pobrać tę wartość w mojej formie symfony (dla użytkownika pola), gdy chciałbym dodać parc. To moja parcsType.php
forma:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('parcName')
->add('users')
;
}
To jest moja forma w widoku gałązka:
<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>
Jak widać, ustawić domyślną wartość mojego pola użytkownika z {{ app.user.username }}
, i to działa, moje pole użytkownika zwraca mi bieżącego użytkownika. Jednak po przesłaniu formularza pole użytkownika i powiązanie (ManyToMany) między Parcs.php
i Users.php
nie są utrwalane/płukane.
To jest mój kod kontrolera:
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()));
}
}
złożenie działa dobrze, kiedy wprowadzić wartość dla nazwy parc dane jest zarejestrowany w mojej bazy danych, ale nie wartość użytkowników i stowarzyszenie ManyToMany.
Bo jeśli tworzysz relację z użytkownikiem, musisz przekazać obiekt użytkownika, a nie tylko nazwę użytkownika. – malcolm
@malcolm przy użyciu metody ** {{app.user.username}} **, w jaki sposób mogę użyć obiektu użytkownika? –
po wywołaniu powiązania można uzyskać aktualnego użytkownika w kontrolerze i ustawić '$ parc-> setUsers ($ user);' Nie potrzebujesz do tego pola formularza. – malcolm