Commit 1b0e633b authored by Patrick Etcheverry's avatar Patrick Etcheverry

Changement classe OK (lien Question -> Reponse ajouté) ; Formulaire de réponse...

Changement classe OK (lien Question -> Reponse ajouté) ; Formulaire de réponse aux questions en cours d'implémentation
parent 87b57f07
......@@ -23,7 +23,6 @@
<link rel="stylesheet" href="{{ asset('css/style_vue_mere.css')}}" type="text/css">
<link rel="stylesheet" href="{{ asset('css/menu.css')}}" type="text/css">
<link rel="stylesheet" href="{{ asset('css/pageLogin.css')}}" type="text/css">
<link rel="stylesheet" href="{{ asset('js/jquery-3.2.1.min.js')}}">
{% endblock %}
{% block others_stylesheets %}
......
......@@ -13,9 +13,13 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use ScenarioBundle\Entity\Project;
use ScenarioBundle\Entity\GeneralAnswer;
use ScenarioBundle\Entity\SequenceAnswer;
use ScenarisationProcessBundle\Entity\ScenarisationStage;
use ScenarisationProcessBundle\Entity\QuestionOrder;
use ScenarisationProcessBundle\Entity\Question;
use UserBundle\Entity\User;
/**
......@@ -308,22 +312,236 @@ class PedagogicalScenarioController extends Controller
{
$em = $this->getDoctrine()->getManager();
// Récupérer les questions de l'étape et pour chaque question récupérer sa réponse
$dql_questionsAndAnswers = $em->createQuery ('
select questionOrders, question
// Récupérer les questions (et les réponses associées) de l'étape et du scénario pédagogique
$dql_questions = $em->createQuery ('
SELECT questionOrders, question, answers
FROM ScenarisationProcessBundle:QuestionOrder questionOrders
JOIN questionOrders.question question
WHERE questionOrders.scenarisationStage = :currentStage
LEFT JOIN questionOrders.question question
LEFT JOIN question.answers answers
WHERE (questionOrders.scenarisationStage = :currentStage)
AND (question.answers IS EMPTY OR answers.pedagogicalScenario = :pedagogicalScenario)
ORDER BY questionOrders.position');
$dql_questionsAndAnswers->setParameter('currentStage', $scenarisationStage);
$dql_questions->setParameter('currentStage', $scenarisationStage);
$dql_questions->setParameter('pedagogicalScenario', $pedagogicalScenario);
return $this->render('ScenarioBundle:pedagogicalscenario:stagequestionsanswersview.html.twig', array('questionsAnswers' => $dql_questionsAndAnswers->getResult()));
return $this->render('ScenarioBundle:pedagogicalscenario:stagequestionsanswersview.html.twig', array(
'questions' => $dql_questions->getResult(),
'pedagogicalScenario' => $pedagogicalScenario,
'scenarisationStage' => $scenarisationStage
));
}
public function stageQuestionsAnswersEditAction(PedagogicalScenario $pedagogicalScenario, ScenarisationStage $scenarisationStage)
public function stageQuestionsAnswersEditAction(PedagogicalScenario $pedagogicalScenario, ScenarisationStage $scenarisationStage, Request $userRequest)
{
return $this->render('ScenarioBundle:pedagogicalscenario:stagequestionsanswersedit.html.twig');
$em = $this->getDoctrine()->getManager();
// Récupère les questions (et les réponses) de l'étape courante
$dql_questions = $em->createQuery ('
SELECT questionOrders, question, answers
FROM ScenarisationProcessBundle:QuestionOrder questionOrders
LEFT JOIN questionOrders.question question
LEFT JOIN question.answers answers
WHERE (questionOrders.scenarisationStage = :currentStage)
ORDER BY questionOrders.position');
$dql_questions->setParameter('currentStage', $scenarisationStage);
$Questions = $dql_questions->getResult();
$numberOfQuestions = sizeof($Questions);
// Si l'étape contient des questions
if ($numberOfQuestions > 0)
{
/* On construit un tableau dans lequel les données du formulaire
seront recueillies */
$tabReponses = array();
/* On créé un constructeur de formulaires qui pourra fabriquer des
formulaires capables de remplir $tabQuestionsReponses */
$createurFormulaires = $this->createFormBuilder($tabReponses);
/* Booléen : si l'utilisateur courant est un "ingénieur pédagogique", il peut modifier le champ "remarque ingénieur"
dans tous les autres cas (il n'y en a qu'un, c'est "enseignant") l'utilisateur ne peut pas modifier le champ */
$readonly = ($this->get('security.authorization_checker')->isGranted("ROLE_PEDAGOGICAL_ENGINEER")? false:true);
/* On utilise le constructeur de formulaires pour définir les champs qui
constitueront le formulaire de contact */
for ($i = 0 ; $i < $numberOfQuestions; $i++)
{
/* A chaque tour de boucle on réinitialise les variables */
$placeholderEngineerObservation = "";
$engineerObservation = "";
$validationState = false;
$reponseAlaQuestionCourante = $this->extractAnswerFromCollection($Questions[$i]->getQuestion()->getAnswers(), $pedagogicalScenario);
/* On récupère la remarque de l'ingénieur pédagogique */
if ($reponseAlaQuestionCourante != null && !empty($reponseAlaQuestionCourante->getPedagogicalEngineerObservation()))
$engineerObservation = $reponseAlaQuestionCourante->getPedagogicalEngineerObservation();
else
$placeholderEngineerObservation = "Pas de remarque";
/* On récupère l'état (satisfaisante ou pas) de la question */
if ($reponseAlaQuestionCourante != null && $reponseAlaQuestionCourante->getIsValid() == true)
$validationState = true;
// S'il s'agit d'une question dite "générale" (<=> textuelle)
if ($Questions[$i]->getQuestion()->getType() == 'generalQuestion')
{
$answerPlaceholder = "";
$actualAnswer = "";
/* S'il l'objet réponse est initialisé et n'est pas vide */
if ($reponseAlaQuestionCourante != null && !empty($reponseAlaQuestionCourante->getTextAnswer()) )
// On récupère le contenu
$actualAnswer = $reponseAlaQuestionCourante->getTextAnswer();
else
// On met un placeholder
$answerPlaceholder = "Pas de réponse";
$createurFormulaires->add("answer_$i", 'textarea', array(
'data' => $actualAnswer,
'required' => false,
'attr' => array(
'placeholder' => $answerPlaceholder)));
}
// Sinon si c'est une question séquence
else if ($Questions[$i]->getQuestion()->getType() == 'sequenceQuestion')
{
$sequencesPrecedementSpecifiees = null;
// On récupère la réponse séquence si on y a déjà répondu auparavant
if ($reponseAlaQuestionCourante != null && !empty($reponseAlaQuestionCourante->getSequencesArray()))
$sequencesPrecedementSpecifiees = $reponseAlaQuestionCourante->getSequencesArray();
$createurFormulaires->add("answer_$i", 'collection', array(
'data' => $sequencesPrecedementSpecifiees,
'required' => false,
'allow_add' => true,
'by_reference' => false,));
}
// Quelque soit le cas, il y a une remarque de la part d'un ingénieur ainsi que la validation
$createurFormulaires->add("observation_$i", 'textarea', array(
'data' => $engineerObservation,
'read_only' => $readonly,
'required' => false,
'attr' => array(
'placeholder' => $placeholderEngineerObservation)));
$createurFormulaires->add("isValid_$i", "checkbox", array(
'data' => $validationState,
'label' => 'Est satisfaisante',
'required' => false,
'attr' => array('class' => 'caseAcocher')
));
}
// On génère le formulaire reponses avec les champs précédemment définis
$formulaireReponses = $createurFormulaires->getForm();
// Enregistrement des données dans le tableau
$formulaireReponses->handleRequest($userRequest);
$submit = $formulaireReponses->isSubmitted();
if ($submit)
{
/* On récupère les données du formulaire dans un tableau */
$tabbReponses = $formulaireReponses->getData();
for ($i = 0 ; $i < $numberOfQuestions; $i++)
{
/* On récupère Réponse qui répond à la question courante */
$reponseAlaQuestionCourante = $this->extractAnswerFromCollection($Questions[$i]->getQuestion()->getAnswers(), $pedagogicalScenario);
if ($Questions[$i]->getQuestion()->getType() == "generalQuestion")
{
if ($reponseAlaQuestionCourante != null)
{
$answer = $reponseAlaQuestionCourante;
//$em->persist($reponseAlaQuestionCourante);
}
else
{
$answer = new GeneralAnswer();
/* Le lien GeneralQuestion 1 <-> * GeneralQuestion (la raciproque est faire de l'autre coté) */
$answer->setGeneralQuestion($Questions[$i]->getQuestion());
}
$answer->setTextAnswer($tabbReponses["answer_$i"]);
}
// Réponse de type séquence
else if ($Questions[$i]->getQuestion()->getType() == "sequenceQuestion")
{
// Si l'utilisateur a répondu à la question courante
if ($reponseAlaQuestionCourante != null)
{
$answer = $reponseAlaQuestionCourante;
}
else
{
$answer = new SequenceAnswer();
/* Le lien SequenceQuestion 1 <-> * SequenceAnswer (la raciproque est faire de l'autre coté) */
$answer->setSequenceQuestion($Questions[$i]->getQuestion());
}
$answer->setSequencesArray($tabbReponses["answer_$i"]);
}
// La remarque ingé et la validité sont propores à tous les types de questions
$answer->setPedagogicalEngineerObservation($tabbReponses["observation_$i"]);
$answer->setIsValid($tabbReponses["isValid_$i"]);
/* Le lien Question 1 <-> * Reponse (la réciproque est faite de l'autre cote) */
$Questions[$i]->getQuestion()->addAnswer($answer);
/* Le lien PedagogicalScenario 1 <-> * Reponse (la réciproque est faite de l'autre cote) */
$pedagogicalScenario->addAnswer($answer);
/* On enregistre en base de données*/
$em->persist($Questions[$i]);
$em->flush();
}
}
}
else {
// Dire qu'il n'y a pas de question
}
return $this->render('ScenarioBundle:pedagogicalscenario:stagequestionsanswersedit.html.twig', array(
'questions' => $Questions,
'pedagogicalScenario' => $pedagogicalScenario,
'scenarisationStage' => $scenarisationStage,
'formulaireReponses' => $formulaireReponses->createView(),
'submit' => $submit
));
}
/* A partir d'une collection d'object Answer et d'un scénario pédagogique :
Retourne la réponse correspondant au scénario pédagogique
Sinon, retourne 'null' */
// J'ai fait cette méthode car au niveau de la requete ligne 340
// Je n'ai pas réussi à récupérer la réponse d'un scénario pédagogique en particulier.
// Dans le cas où des reponses existaient déjà mais dans d'autres scénario péda,
// La requête ne renvoyait pas la question
private function extractAnswerFromCollection($answers, $pedagogicalScenario)
{
$indiceCourant = 0;
$tailleTab = sizeof($answers);
$reponseTrouvee = null;
$idScenarioPeda = $pedagogicalScenario->getId();
while ($indiceCourant < $tailleTab && $reponseTrouvee == null)
{
if ($answers[$indiceCourant]->getPedagogicalScenario()->getId() == $idScenarioPeda)
{
$reponseTrouvee = $answers[$indiceCourant];
}
$indiceCourant++;
}
return $reponseTrouvee;
}
}
......@@ -32,16 +32,24 @@ class LoadAnswerData implements FixtureInterface, ContainerAwareInterface, Order
{
$em = $this->container->get('doctrine')->getEntityManager('default');
/*$this->ajouterReponseGenerale($manager,$em,"Comment Vous appelez vous ?","Gaizka Alçuyet");
$this->ajouterReponseGenerale($manager,$em,"Combien de séquences ?","3");
$this->ajouterReponseGenerale($manager,$em,"Combien de séances ?","3");*/
// A n'as pas de réponse
// B a une réponse dans M1102
$this->ajouterReponseGenerale($manager,$em,"B","rep B","M1102");
// C a une réponse dans M1102 et une dans M1103
$this->ajouterReponseGenerale($manager,$em,"C","rep C M1102", "M1102");
$this->ajouterReponseGenerale($manager,$em,"C","rep C M1103", "M1103");
// D a une réponse dans M1103 et M1104 (aucune dans M1102)
$this->ajouterReponseGenerale($manager,$em,"D","red D M1103", "M1103");
$this->ajouterReponseGenerale($manager,$em,"D","red D M1104", "M1104");
/*$this->ajouterReponseSequence($manager,$em,);
$this->ajouterReponseSeance($manager,$em,);*/
}
public function ajouterReponseGenerale(ObjectManager $manager,$em,$intituleQuestion,$contenuReponse)
public function ajouterReponseGenerale(ObjectManager $manager, $em, $intituleQuestion, $contenuReponse,$scenarioPedagogique)
{
$reponseGenerale = new GeneralAnswer();
......@@ -49,14 +57,16 @@ class LoadAnswerData implements FixtureInterface, ContainerAwareInterface, Order
$reponseGenerale->setIsValid(false);
$repoQuestionGenerale = $em->getRepository('ScenarisationProcessBundle:GeneralQuestion');
$questionAssociee = $repoQuestionGenerale->findOneBy(array("frWording" => $intituleQuestion));
$reponseGenerale->setGeneralQuestion($questionAssociee);
$repoScenarioPeda = $em->getRepository('ScenarioBundle:PedagogicalScenario');
$scenarioAssocie = $repoScenarioPeda->findOneBy(array("shortname" => "M1102"));
$scenarioAssocie->addGeneralAnswer($reponseGenerale);
$scenarioAssocie = $repoScenarioPeda->findOneBy(array("shortname" => $scenarioPedagogique));
$scenarioAssocie->addAnswer($reponseGenerale);
$questionAssociee->addAnswer($reponseGenerale);
$manager->persist($reponseGenerale);
$manager->flush();
......
......@@ -46,6 +46,7 @@ class LoadPedagogicalScenarioData implements FixtureInterface, ContainerAwareInt
/* On ajoute deux scenario pedagogique*/
$m1102 = $this->ajouterM1102($manager,$em,$patrick,$dutInfo,$demarche);
$m1103 = $this->ajouterM1103($manager,$em,$patrick,$dutInfo,$demarche);
$m1104 = $this->ajouterM1104($manager,$em,$patrick,$dutInfo,$demarche);
$gaizka->addPedagogicalScenarioDesigned($m1102);
$pantxika->addPedagogicalScenarioDesigned($m1102);
......@@ -96,6 +97,26 @@ class LoadPedagogicalScenarioData implements FixtureInterface, ContainerAwareInt
return $m1103;
}
public function ajouterM1104(ObjectManager $manager,$em,$enseignantReferent,$projet,$demarche)
{
$m1104 = new PedagogicalScenario();
$repoDemarche = $em->getRepository('ScenarisationProcessBundle:ScenarisationProcess');
$demarcheMere = $repoDemarche->findOneBy(array('title'=>$demarche));
$m1104->setScenarisationProcess($demarcheMere);
$m1104->setShortname("M1104");
$m1104->setFullname("POO");
$m1104->updateReferentTeacher($enseignantReferent);
$m1104->setProject($projet);
$manager->persist($m1104);
$manager->flush();
return $m1104;
}
public function getOrder()
{
return 4;
......
......@@ -38,6 +38,18 @@ class Answer
*/
private $isValid;
/**
* @ORM\ManyToOne(targetEntity="ScenarisationProcessBundle\Entity\Question", inversedBy="answers", cascade={"persist"})
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
*/
private $question;
/**
* @ORM\ManyToOne(targetEntity="ScenarioBundle\Entity\PedagogicalScenario", inversedBy="answers", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
*/
private $pedagogicalScenario;
/**
* Get id
*
......@@ -95,4 +107,52 @@ class Answer
{
return $this->isValid;
}
/**
* Set question
*
* @param \ScenarisationProcessBundle\Entity\Question $question
*
* @return Answer
*/
public function setQuestion(\ScenarisationProcessBundle\Entity\Question $question)
{
$this->question = $question;
return $this;
}
/**
* Get question
*
* @return \ScenarisationProcessBundle\Entity\Question
*/
public function getQuestion()
{
return $this->question;
}
/**
* Get pedagogicalScenario
*
* @return \ScenarioBundle\Entity\PedagogicalScenario
*/
public function getPedagogicalScenario()
{
return $this->pedagogicalScenario;
}
/**
* Set pedagogicalScenario
*
* @param \ScenarioBundle\Entity\PedagogicalScenario $pedagogicalScenario
*
* @return Answer
*/
public function setPedagogicalScenario(\ScenarioBundle\Entity\PedagogicalScenario $pedagogicalScenario)
{
$this->pedagogicalScenario = $pedagogicalScenario;
return $this;
}
}
......@@ -101,28 +101,4 @@ class GeneralAnswer extends Answer
return $this->generalQuestion;
}
/**
* Set pedagogicalScenario
*
* @param \ScenarioBundle\Entity\PedagogicalScenario $pedagogicalScenario
*
* @return GeneralAnswer
*/
public function setPedagogicalScenario(\ScenarioBundle\Entity\PedagogicalScenario $pedagogicalScenario)
{
$this->pedagogicalScenario = $pedagogicalScenario;
return $this;
}
/**
* Get pedagogicalScenario
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getPedagogicalScenario()
{
return $this->pedagogicalScenario;
}
}
......@@ -60,10 +60,10 @@ class PedagogicalScenario
private $scenarisationProcess;
/**
* @ORM\OneToMany(targetEntity="ScenarioBundle\Entity\GeneralAnswer", mappedBy="pedagogicalScenario", cascade={"persist","remove"})
* @ORM\OneToMany(targetEntity="ScenarioBundle\Entity\Answer", mappedBy="pedagogicalScenario", cascade={"persist","remove"})
* @ORM\JoinColumn(nullable=true)
*/
private $generalAnswers;
private $answers;
/**
* @ORM\OneToMany(targetEntity="ScenarioBundle\Entity\PedagogicalScenarioFormation", mappedBy="pedagogicalScenario")
......@@ -293,38 +293,38 @@ class PedagogicalScenario
}
/**
* Add generalAnswer
* Add answer
*
* @param \ScenarioBundle\Entity\GeneralAnswer generalAnswer
* @param \ScenarioBundle\Entity\Answer answer
*
* @return PedagogicalScenario
*/
public function addGeneralAnswer(\ScenarioBundle\Entity\GeneralAnswer $generalAnswer)
public function addAnswer(\ScenarioBundle\Entity\Answer $answer)
{
$this->generalAnswers[] = $generalAnswer;
$generalAnswer->setPedagogicalScenario($this);
$this->answers[] = $answer;
$answer->setPedagogicalScenario($this);
return $this;
}
/**
* Remove generalAnswer
* Remove answer
*
* @param \ScenarioBundle\Entity\GeneralAnswer $generalAnswer
* @param \ScenarioBundle\Entity\Answer $answer
*/
public function removeGeneralAnswer(\ScenarioBundle\Entity\GeneralAnswer $generalAnswer)
public function removeAnswer(\ScenarioBundle\Entity\Answer $answer)
{
$this->generalAnswers->removeElement($questionGenerale);
$this->answers->removeElement($answer);
}
/**
* Get generalAnswers
* Get answers
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getGeneralAnswers()
public function getAnswers()
{
return $this->generalAnswers;
return $this->answers;
}
/**
......
......@@ -28,6 +28,13 @@ class SequenceAnswer extends Answer
*/
private $sequenceQuestion;
/**
* @var array
*
* @ORM\Column(name="sequencearray", type="array", nullable=true)
*/
private $sequencesArray;
/**
* @ORM\OneToMany(targetEntity="ScenarioBundle\Entity\Sequence", mappedBy="sequenceAnswer", cascade={"persist"})
* @ORM\JoinColumn(nullable=true)
......@@ -105,4 +112,28 @@ class SequenceAnswer extends Answer
return $this->sequences;
}
/**
* Get sequencesArray
*
* @return array
*/
public function getSequencesArray()
{
return $this->sequencesArray;
}
/**
* Set sequencesArray
*
* @param Array $sequencesArray
*
* @return SequenceAnswer
*/
public function setSequencesArray($sequencesArray)
{
$this->sequencesArray = $sequencesArray;
return $this;
}
}
<?php
namespace ScenarioBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SequenceType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title','text', array( 'label' => 'title'));
$builder->add('duration','text', array( 'label' => 'duration'));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'ScenarioBundle\Entity\Sequence'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'scenariobundle_sequence';
}
}
......@@ -74,4 +74,4 @@ pedagogicalscenario_questionsanswers_view:
pedagogicalscenario_questionsanswers_edit:
path: /{id}/edit/{scenarisationStage}
defaults: { _controller: "ScenarioBundle:PedagogicalScenario:stageQuestionsAnswersEdit" }
methods: GET
methods: [GET, POST]
......@@ -21,7 +21,7 @@
<tr>
<td>{{stageOrder.position}}</td>
<td>{{stageOrder.scenarisationStage.title}}</td>
<td>{{stageOrder.scenarisationStage.progress}}%</td>