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 :)

5 réponses


Bonjour.

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!)

Tu passe la variable $reuest en argument dans la fonction, mais par la suite tu utilises la variable $request, qui n'existe pas.
Ton problème ne viendrait-t'il pas de là ?

/* 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   */

Pour ce qui concerne infoChapitres, lorsque tu fais $this->get('session')->set('infoChapitres', $idChapitres);, il est situé dans une boucle, par conséquent, à mon avis tu écrases la valeur précédente à chaque itération de la boucle foreach.

emile01
Auteur

merci pour ta réponse. la variable "$reuest" est une faute de frappe.

J'ai mis dans un boucle pour récupérer tous les questions (elle est de type arrayCollection) qui concerne ce chapitre avec id=1

 $infQues= array();
 $x= $chapitres->getChpQuestions();
   $i=0;
    foreach ($x as $Tousquestions)
    {
        $infQues[$i++]=$Tousquestions->getId();
    }

j'ai pas bien compris ta proposition mon ami:

Pour ce qui concerne infoChapitres, lorsque tu fais $this->get('session')->set('infoChapitres', $idChapitres);, il est situé dans une boucle, par conséquent, à mon avis tu écrases la valeur précédente à chaque itération de la boucle foreach.

Merci,

j'ai pas bien compris ta proposition mon ami

En effet, je n'ai pas spécialement fait gaffe que tu ne récupérait qu'un seul enregistrement, du coup, je me demande pourquoi tu fais une boucle pour récupérait l'id de l'enregistrement en question.
Ne serait'il pas plus approprié de récupérer sa valeur directement, par exemple : $entity->id, que tu pourrais directement injecter :

$entity = $em->getRepository('ChapitresBundle:Chapitres')->findBy(array('id'=> $id));
$this->get('session')->set('infoChapitres', $entity->id);

Au passage, pourquoi tu fais deux fois la même requête, alors que tu récupères les mêmes données ?

$info = $em->getRepository('ChapitresBundle:Chapitres')->find($id);
// et ...
$entity = $em->getRepository('ChapitresBundle:Chapitres')->findBy(array('id'=> $id));
emile01
Auteur

lorsque j'utilise cette instruction, il a y un probléme de dans

$entity->id
Notice: Trying to get property of non-object

dans ce cas j'utilise:

$this->get('session')->set('infoChapitres', $entity->getId());

concernant l'utilisation de deux requetes à la fois. car si je retourne la variable "$entity" a la vue il affiche que le key nomChap n'existe pas ce pour ce la que je retourne la variable "$info" à la vue.

en conclusion j'ai testé la récupération des ids et j'ai aucun probléme pour ça. Mais au niveau de la boucle "if" de méthode "createAction" j'arrive pas a afficher une chaine de caractére . tousjours il dépasse ce bloque de code:

     if($form->isValid()) { 
     var_dump('hello'); exit(); /*aucune résultat affichée ici*/
        $pourcentageN=$entity->getNivConformite();
        $entity->setNivEnPourcentage($pourcentageN);
        $entity->setDateReponse($dateresp);
        $entity->setProjet($this->get('session')->get('infoProjet'));

        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' =>'',
        ));
      }
     // voilà mon form dans la vue
         {% for ques in  entity.ChpQuestions %} // car un chapitre contient un ensemble des questions
    <li>
        <div class="wizard-heading">
            {{ ques.Clause }}.  {{ ques.Question }}
            <span class="icon-summary"></span>
        </div>
        <div class="wizard-content">
            <div class="panel-body">
                <p>
          <form action="{{ path('mission_create') }}" method="post" {{ form_enctype(form) }} >
              {{ form_row(form.NivConformite, { 'label': 'Niveau De Comformité *:'}) }}
                {{ form_row(form.preuves, { 'label': 'La preuve *:'}) }}

                      {{ form_rest(form) }}
                    <button class="btn-green done" type="submit"><strong>Sauvegarder</strong></button>
               </p> 
               </div>
               </div>
               </li>
               </form>
               {% endfor %}

vraiment j'arrive pas a résoudre ce probléme.

emile01
Auteur

ce probléme comment résoudre S'il vous plait:
Warning: spl_object_hash() expects parameter 1 to be object, array given

   $em= $this->getDoctrine()->getManager();
   $chapitres= $em->getRepository('ChapitresBundle:Chapitres')->find($this->get('session')->get('infoChapitres'));

    $projet = $em->getRepository('ProjetsBundle:Projets')->find($this->get('session')->get('infoProjet'));

    $q=$em->getRepository('QuestionsBundle:Questions')->findByAQuestions($this->get('session')->get('infoChapitres'));

if ($form->isValid())
      { 
       $pourcentageN=$entity->getNivConformite();
        $entity->setNivEnPourcentage($pourcentageN);
        $entity->setDateReponse($dateresp);
        $entity->setProjet($projet);

        foreach ( $q as $object)
        {
           $entity->setQuestions($object);
           }
        $em->persist($entity);
        $em->flush();
        return $this->render('MissionsBundle:ReponsesQues:show.html.twig', array(
            'entity' => $chapitres,
            'form'   => $form->createView(),
            'error' =>' ',
        ));

      }