Bonjour,
j'ai une relation 1.. (ManyToMany) entres les chapitres et les questions. C'est a dire qu'un chapitre possède plusieurs questions et une question a un seul chapitre. Chaque question possède une réponse par projet (projet ->1.. ->reponseQuestion<-- 1..*<--questions). donc ce cas il faut que récupéré l'id du chapitre, de la question et de projet.
La table ResponseQues contient: son id , id_question, id_projet, reponse
la classe Chapitres:
class Chapitres{
/** * @ORM\OneToMany(targetEntity="Management\QuestionsBundle\Entity\Questions", mappedBy="chps" , cascade={"persist"})
private $chpQuestions;
//ici les getters et les setters
}
-la classe questions:
class Questions{
/** * @ORM\ManyToOne(targetEntity="Management\ChapitresBundle\Entity\Chapitres", inversedBy="chpQuestions") * @ORM\JoinColumn(nullable=false) * @Assert\NotBlank(message=" La spécification du chapitre est obligatoire") */
private $chps;
-la classe ResponseQuestions:
class ResponseQuestions{
/**around * @ORM\ManyToOne(targetEntity="Management\ProjetsBundle\Entity\Projets", inversedBy="projetResponse") * @ORM\JoinColumn(nullable=false , name="projets_id" , referencedColumnName="id_projets") * @Assert\NotBlank(message=" ce champs est obligatoire") */
private $projet;
/** *@ORM\ManyToOne(targetEntity="Management\QuestionsBundle\Entity\Questions", inversedBy="Response") * @ORM\JoinColumn(nullable=false, referencedColumnName="id_questions" , name="questions_id") * @Assert\NotBlank(message=" ce champs est obligatoire") */
private $questions;around}
-formType:
$builder
->add('reponse','text'); // concernant la classe reponseQuestions
Pour récupérer les ids j'ai utilisé la notion de session. Alors j'ai arrivé a récupérer les ids mais lorsque j'utilise ces dernier(ids) dans mon action "create" pour créer une réponse pour les questions du chapitre qui est en cours, j'ai un probléme qu'il arrive pas a sauvegarder dans la BD et il n'affiche aucun erreur (j'en sais pas pourquoi!)
voilà mon code:
-l'action "show" contient l'affichage du chapitre (url: /1/show) , la récupération de l'id et l'affichage de form
public function showAction($id){
$message= " Aucune information existe";
$ques= new ReponsesQues(); // l'entité qui contient tous les réponses aux questions
$em = $this->getDoctrine()->getManager();
// affichage de tous les informations du chapitre ayant comme id =1
$info = $em->getRepository('ChapitresBundle:Chapitres')->find($id);
//création du form pour faire l'ajout de la réponse
$form=$this->createForm(new ReponsesQuesType(), $ques);
$entity = $em->getRepository('ChapitresBundle:Chapitres')->findBy(array('id'=> $id));
foreach($entity as $IdChps) {
// pour récupérer l'id du chapitre
$idChapitres=$IdChps->getId();
/* var_dump( $idChapitres); --> il affiche array[0] : int(1) */
//ici la création de la variable session et stocké de dans l'id du chapitre (dans notre cas l'id=1)
$this->get('session')->set('infoChapitres', $idChapitres);
}
if (!$entity ) {
return $this->render('ChapitresBundle:Default:404.html.twig', array('info' => $message));
}
return $this->render('MissionsBundle:ReponsesQues:show.html.twig', array(
'entity' => $info,
'form' => $form->createView(),
'error' =>'',
));
}
-l'action "create" permet de récupérer l'objet ReponsesQues crée et stocké dans BD en modifiant quelque variable.
public function createAction(Request $reuest){
//création du tableau pour stocker les ids des questions par chapitres
$infQues = array();
// récupérer la date 'now'
$dateresp=new \DateTime();
$entity = new ReponsesQues();
$form= $this->createForm(new ReponsesQuesType(), $entity );
$form->handleRequest($request);
/* var_dump($this->get('session')->get('infoChapitres')); --> il affiche array[0]: int(1)
var_dump($this->get('session')->get('infoProjet')); --> il affiche array[0]; int(4)
=> note: ces ids existent dans ma BD */
$em = $this->getDoctrine()->getManager();
// afficher tous les informations du chapitre selon l'id qui se trouve dans la variable session "infoChapitres", dans ce cas id=1 (les informations sont bien affiché)
$chapitres= $em->getRepository('ChapitresBundle:Chapitres')->find($this->get('session')->get('infoChapitres'));
// récupération des questions en utilisant la variable de la relation entre l'entité 'Questions' & 'Chapitres'
$x=$chapitres->getChpQuestions();
/* ce traitement permet de stocker les ids des questions par chapitre dans un tableau */
$i=0;
foreach ($x as $Tousquestions)
{
$infQues[$i++]=$Tousquestions->getId();
}
// var_dump $infQues); --> il affiche array[0]: int(1) car ce chapitre(id=1) contient une seule question (id=1)
if ($form->isValid())
{
// le probléme se trouve ici il n'arrive a lire ce boucle, j'ai faire un petit test dedans avec une chaîne des caractères en utilisant la fonction "var_dump('hello')".
//Mais ce traitement ne sera pas affiché !
$pourcentageN=$entity->getNivConformite();
$entity->setNivEnPourcentage($pourcentageN);
$entity->setDateReponse($dateresp);
// ajouter l'id du projet
$entity->setProjet($this->get('session')->get('infoProjet'));
// l'ajout de tous les ids des questions (car un chapitre peut contenir plus que une question (ICI la relation 1..*))
foreach ($x as $qu)
{
// $entity->setQuestions($infQues);
$qu->setQuestions($infQues);
}
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->render('MissionsBundle:ReponsesQues:show.html.twig', array(
'entity' => $chapitres,
'form' => $form->createView(),
'error' =>'',
));
}
Merci d'obtenir la bonne solution :)