Bonjour,

Je débute avec symfony, j'ai déjà découvert pas mal de chose. je suis en train de développer une petite application éducative. j'ai créer une entité matiere et j'ai généré un crud. l'entité matiere est lié à mon entité utilisateur (FOSuserBundle ) grace à une relation ManyToOne, ceci pour que chaque enseignant ne puisse avoir accès qu'aux matieres qu'il a crée. Je voudrai en quelque sorte personnalisé chaque session.
Pour la création d'une matière, je souhaite dont que le champ user soit rempli automatiquement avec la session de l'utilisateur. voici mon code
MatiereType.php

<?php

namespace App\BackBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MatiereType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nom')
            ->add('statut')
            ->add('user') 
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'App\BackBundle\Entity\Matiere'
        ));
    }
}

Matiere.php

<?php

namespace App\BackBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Matiere
 *
 * @ORM\Table(name="matiere")
 * @ORM\Entity(repositoryClass="App\BackBundle\Repository\MatiereRepository")
 */
class Matiere
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\ManyToOne(targetEntity="App\UserBundle\Entity\User")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=255)
     */
    private $nom;

    /**
     * @var bool
     *
     * @ORM\Column(name="statut", type="boolean")
     */
    private $statut;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nom
     *
     * @param string $nom
     * @return Matiere
     */
    public function setNom($nom)
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * Get nom
     *
     * @return string 
     */
    public function getNom()
    {
        return $this->nom;
    }

    /**
     * Set statut
     *
     * @param boolean $statut
     * @return Matiere
     */
    public function setStatut($statut)
    {
        $this->statut = $statut;

        return $this;
    }

    /**
     * Get statut
     *
     * @return boolean 
     */
    public function getStatut()
    {
        return $this->statut;
    }
    public function __toString(){
        return $this->getNom();
    }

    /**
     * Set user
     *
     * @param \App\UserBundle\Entity\User $user
     * @return Matiere
     */
    public function setUser(\App\UserBundle\Entity\User $user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \App\UserBundle\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }

}

MatiereController.php

<?php

namespace App\BackBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use App\BackBundle\Entity\Matiere;
use App\BackBundle\Form\MatiereType;

/**
 * Matiere controller.
 *
 */
class MatiereController extends Controller
{
    /**
     * Lists all Matiere entities.
     *
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getManager();

        $matieres = $em->getRepository('AppBackBundle:Matiere')->findAll();

        return $this->render('matiere/index.html.twig', array(
            'matieres' => $matieres,
        ));
    }

    /**
     * Creates a new Matiere entity.
     *
     */
    public function newAction(Request $request)
    {
        $matiere = new Matiere();
        $form = $this->createForm('App\BackBundle\Form\MatiereType', $matiere);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($matiere);
            $em->flush();

            return $this->redirectToRoute('matiere_show', array('id' => $matiere->getId()));
        }

        return $this->render('matiere/new.html.twig', array(
            'matiere' => $matiere,
            'form' => $form->createView(),
        ));
    }

    /**
     * Finds and displays a Matiere entity.
     *
     */
    public function showAction(Matiere $matiere)
    {
        $deleteForm = $this->createDeleteForm($matiere);

        return $this->render('matiere/show.html.twig', array(
            'matiere' => $matiere,
            'delete_form' => $deleteForm->createView(),
        ));
    }

    /**
     * Displays a form to edit an existing Matiere entity.
     *
     */
    public function editAction(Request $request, Matiere $matiere)
    {
        $deleteForm = $this->createDeleteForm($matiere);
        $editForm = $this->createForm('App\BackBundle\Form\MatiereType', $matiere);
        $editForm->handleRequest($request);

        if ($editForm->isSubmitted() && $editForm->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($matiere);
            $em->flush();

            return $this->redirectToRoute('matiere_edit', array('id' => $matiere->getId()));
        }

        return $this->render('matiere/edit.html.twig', array(
            'matiere' => $matiere,
            'edit_form' => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }

    /**
     * Deletes a Matiere entity.
     *
     */
    public function deleteAction(Request $request, Matiere $matiere)
    {
        $form = $this->createDeleteForm($matiere);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->remove($matiere);
            $em->flush();
        }

        return $this->redirectToRoute('matiere_index');
    }

    /**
     * Creates a form to delete a Matiere entity.
     *
     * @param Matiere $matiere The Matiere entity
     *
     * @return \Symfony\Component\Form\Form The form
     */
    private function createDeleteForm(Matiere $matiere)
    {
        return $this->createFormBuilder()
            ->setAction($this->generateUrl('matiere_delete', array('id' => $matiere->getId())))
            ->setMethod('DELETE')
            ->getForm()
        ;
    }
}

pouvez vous m'aidez s'il vous plait ????????

4 réponses


Dans le cas d'un super admin qui créer les matières et les attribue aux utilisateurs, dans le formulaire :

//...
$builder
            ->add('nom')
            ->add('statut')
            ->add('user', EntityType::class,[
                "label"=>"utilisateur",
                'choice_label' => 'lastname',
                "class"=>User::class,
                "query_builder"=>function(EntityRepository $repo){
                        return $repo->createQueryBuilder("u")->orderBy("lastname");
                }
            ]) 
        ;
//....

rien à changer dans le controller
la liste des utilisateurs sera dans dans un champ select.

Dans le cas de l'utilisateur qui crée lui même ses matières :
L'utilisateur doit être loggué
pas de champ "user" dans le formulaire
Dans le controller :

function newAction(Request $request){

    $user = $this->getUser();

    $matiere = new Matiere();
    $matiere->setUser($user);
        $form = $this->createForm('App\BackBundle\Form\MatiereType', $matiere);
        $form->handleRequest($request);
        // ... le reste ...
}

Merci Nico, c'est cohérent (Deuxieme cas). je teste et je fais un retour sur le forum

Helo nico, j'ai testé et tout marche bien.

 public function newAction(Request $request)
    {
        $user = $this->getUser();
        $matiere = new Matiere();
        $matiere->setUser($user);
        $form = $this->createForm('App\BackBundle\Form\MatiereType', $matiere);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($matiere);
            $em->flush();

            return $this->redirectToRoute('matiere_show', array('id' => $matiere->getId()));
        }

        return $this->render('matiere/new.html.twig', array(
            'matiere' => $matiere,
            'form' => $form->createView(),
        ));
    }

merci, on peut considérer le sujet comme clos

cool !
heureux de rendre service