Commit dbff1041 authored by Patrick Etcheverry's avatar Patrick Etcheverry

Fonctions des tableaux dynamiques de question / réponses seq/ seances stabilisées

parent b3068f05
......@@ -25,6 +25,8 @@ title: "Title"
description: "Description"
position: "Position"
design: "Design"
duration: "Duration"
management: "Management"
admin: "Administration"
questionBank: "Bank of questions"
......@@ -86,22 +88,22 @@ cancel: "Cancel"
Delete:
pedagogicalScenario:
title: "Delete a pedagogical scenario"
sentence: "Are you sure that you want to delete the pedagogical scenario: "
sentence: "Please confirm. You are going to delete the pedagogical scenario"
project:
title: "Delete a project"
sentence: "Are you sure that you want to delete the project: "
sentence: "Are you sure that you want to delete the project"
trainingCourse:
title: "Delete a training course"
sentence: "Are you sure that you want to delete the training course: "
sentence: "Are you sure that you want to delete the training course"
user:
title: "Delete a user"
sentence: "Are you sure that you want to delete the user: "
sentence: "Are you sure that you want to delete the user"
scenarisationProcess:
title: "Delete a scenarisation process"
sentence: "Are you sure that you want to delete the scenarisation process: "
sentence: "Are you sure that you want to delete the scenarisation process"
scenarisationStage:
title: "Delete a scenarisation stage"
sentence: "Are you sure that you want to delete the scenarisation stage: "
sentence: "Are you sure that you want to delete the scenarisation stage"
question:
title: "Delete a question"
sentence: "Are you sure that you want to delete the question: "
sentence: "Are you sure that you want to delete the question"
......@@ -25,6 +25,8 @@ title: "Título"
description: "Descripción"
position: "Posición"
design: "Diseñar"
duration: "A TRADUIRE"
management: "A TRADUIRE"
admin: "Administratión"
questionBank: "Banco de preguntas"
......@@ -85,22 +87,22 @@ cancel: "Anular"
Delete:
pedagogicalScenario:
title: "Suprimir un escenario pedagógico"
sentence: "Esté usted seguro que quiere suprimir el escenario pedagógico : "
sentence: "Esté usted seguro que quiere suprimir el escenario pedagógico "
project:
title: "Suprimir un proyecto"
sentence: "Esté usted seguro que quiere suprimir el proyecto : "
sentence: "Esté usted seguro que quiere suprimir el proyecto "
trainingCourse:
title: "Suprimir una formación"
sentence: "Esté usted seguro que quiere suprimir la formation : "
sentence: "Esté usted seguro que quiere suprimir la formation "
user:
title: "Suprimir un usuario"
sentence: "Esté usted seguro que quiere suprimir el usuario : "
sentence: "Esté usted seguro que quiere suprimir el usuario "
scenarisationProcess:
title: "Suprimir un proceso de escenarización"
sentence: "Esté usted seguro que quiere suprimir el proceso de escenarización : "
sentence: "Esté usted seguro que quiere suprimir el proceso de escenarización "
scenarisationStage:
title: "Suprimir una etapa de escenarización"
sentence: "Esté usted seguro que quiere suprimir la etapa de escenarización : "
sentence: "Esté usted seguro que quiere suprimir la etapa de escenarización "
question:
title: "Suprimir una pregunta"
sentence: "Esté usted seguro que quiere suprimir la pregunta : "
sentence: "Esté usted seguro que quiere suprimir la pregunta "
......@@ -25,6 +25,8 @@ title: "Intitulé"
description: "Description"
position: "Position"
design: "Concevoir"
duration: "Durée"
management: "Gestion"
admin: "Administration"
questionBank: "Banque de questions"
......@@ -88,22 +90,22 @@ cancel: "Annuler"
Delete:
pedagogicalScenario:
title: "Supprimer un scénario pédagogique"
sentence: "Êtes-vous sûr de vouloir supprimer le scénario pédagogique : "
sentence: "Êtes-vous sûr de vouloir supprimer le scénario pédagogique "
project:
title: "Supprimer un projet"
sentence: "Êtes-vous sûr de vouloir supprimer le projet : "
sentence: "Êtes-vous sûr de vouloir supprimer le projet "
trainingCourse:
title: "Supprimer une formation"
sentence: "Êtes-vous sûr de vouloir supprimer la formation : "
sentence: "Êtes-vous sûr de vouloir supprimer la formation "
user:
title: "Supprimer un utilisateur"
sentence: "Êtes-vous sûr de vouloir supprimer l'utilisateur : "
sentence: "Êtes-vous sûr de vouloir supprimer l'utilisateur "
scenarisationProcess:
title: "Supprimer une démarche de scénarisation"
sentence: "Êtes-vous sûr de vouloir supprimer la démarche de scénarisation : "
sentence: "Êtes-vous sûr de vouloir supprimer la démarche de scénarisation "
scenarisationStage:
title: "Supprimer une étape de scénarisation"
sentence: "Êtes-vous sûr de vouloir supprimer l'étape de scénarisation : "
sentence: "Êtes-vous sûr de vouloir supprimer l'étape de scénarisation "
question:
title: "Supprimer une question"
sentence: "Êtes-vous sûr de vouloir supprimer la question : "
sentence: "Êtes-vous sûr de vouloir supprimer la question "
......@@ -114,14 +114,14 @@
<div class="panel-body">
{% if app.session.flashBag.has('success') %}
<div class="alert alert-success">
<strong>Succès !</strong>
<strong>SUCCÈS !</strong>
{% for msg in app.session.flashBag.get('success') %}
{{ msg }}
{% endfor %}
</div>
{% elseif app.session.flashBag.has('alert') %}
<div class="alert alert-danger">
<strong>Attention !</strong>
<strong>ATTENTION !</strong>
{% for msg in app.session.flashBag.get('alert') %}
{{ msg }}
{% endfor %}
......
......@@ -16,6 +16,7 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use ScenarioBundle\Entity\Project;
use ScenarioBundle\Entity\GeneralAnswer;
use ScenarioBundle\Entity\SequenceAnswer;
use ScenarioBundle\Entity\SessionAnswer;
use ScenarisationProcessBundle\Entity\ScenarisationStage;
use ScenarisationProcessBundle\Entity\QuestionOrder;
......@@ -187,6 +188,8 @@ class PedagogicalScenarioController extends Controller
$em->flush();
}
/* Petit message de reussite, à traduire */
$request->getSession()->getFlashBag()->add('success', "Le scénario pédagogique '" . $pedagogicalScenario->getShortname() . "' a bien été supprimé.");
return $this->redirectToRoute('pedagogicalscenario_index', array('userRole' => "pedagogical-engineer"));
}
......@@ -382,7 +385,7 @@ class PedagogicalScenarioController extends Controller
));
}
public function stageQuestionsAnswersEditAction(PedagogicalScenario $pedagogicalScenario, ScenarisationStage $scenarisationStage, Request $userRequest)
public function stageQuestionsAnswersEditAction(Request $request, PedagogicalScenario $pedagogicalScenario, ScenarisationStage $scenarisationStage, Request $userRequest)
{
// We generate the new breadcrumb
$this->createBreadcrumb("answers_edit", $pedagogicalScenario, $scenarisationStage);
......@@ -464,7 +467,10 @@ class PedagogicalScenarioController extends Controller
// Sinon si c'est une question séquence
else if ($Questions[$i]->getQuestion()->getType() == 'sequenceQuestion')
{
$sequencesPrecedementSpecifiees = null;
/* Cette ligne permet de faire en sorte que
si la réponseSéquece est vide, un tableau de deux cases vides s'affiche
(avant, de faire cette ligne, un tableau avec seulement la ligne d'en-tête s'affichait) */
$sequencesPrecedementSpecifiees = array(null,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();
......@@ -475,6 +481,22 @@ class PedagogicalScenarioController extends Controller
'allow_add' => true,
'by_reference' => false,));
}
else if ($Questions[$i]->getQuestion()->getType() == 'sessionQuestion')
{
/* Cette ligne permet de faire en sorte que
si la réponseSéance est vide, un tableau de trois cases vides s'affiche
(avant, de faire cette ligne, un tableau avec seulement la ligne d'en-tête s'affichait) */
$seancesPrecedemmentSpecifiees = array(null,null,null);
// On récupère la réponse séance si on y a déjà répondu auparavant
if ($reponseAlaQuestionCourante != null && !empty($reponseAlaQuestionCourante->getSessionsArray()))
$seancesPrecedemmentSpecifiees = $reponseAlaQuestionCourante->getSessionsArray();
$createurFormulaires->add("answer_$i", 'collection', array(
'data' => $seancesPrecedemmentSpecifiees,
'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(
......@@ -505,12 +527,13 @@ class PedagogicalScenarioController extends Controller
{
/* On récupère les données du formulaire dans un tableau */
$tabbReponses = $formulaireReponses->getData();
var_dump($tabbReponses);
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);
// Réponse de type générale
if ($Questions[$i]->getQuestion()->getType() == "generalQuestion")
{
if ($reponseAlaQuestionCourante != null)
......@@ -541,13 +564,31 @@ class PedagogicalScenarioController extends Controller
$answer->setSequenceQuestion($Questions[$i]->getQuestion());
}
$tableauApresRetraitDesNull = $this->removeNullElementsEndOfTab($tabbReponses["answer_$i"]);
$tableauApresRetraitDesNull = $this->removeNullElementsSequenceTab($tabbReponses["answer_$i"]);
// Fonction "Array Filter" au cas où l'utilisateur aurait laissé des cases vides (null)
$answer->setSequencesArray($tableauApresRetraitDesNull);
}
// Réponse de type séance
else if ($Questions[$i]->getQuestion()->getType() == "sessionQuestion")
{
// Si l'utilisateur a répondu à la question courante
if ($reponseAlaQuestionCourante != null)
{
$answer = $reponseAlaQuestionCourante;
}
else
{
$answer = new SessionAnswer();
/* Le lien SequenceQuestion 1 <-> * SequenceAnswer (la raciproque est faire de l'autre coté) */
$answer->setSessionQuestion($Questions[$i]->getQuestion());
}
$tableauApresRetraitDesNull = $this->removeNullElementsSessionTab($tabbReponses["answer_$i"]);
// Fonction "Array Filter" au cas où l'utilisateur aurait laissé des cases vides (null)
$answer->setSessionsArray($tableauApresRetraitDesNull);
}
// La remarque ingé et la validité sont propores à tous les types de questions
$answer->setPedagogicalEngineerObservation($tabbReponses["observation_$i"]);
......@@ -561,16 +602,23 @@ class PedagogicalScenarioController extends Controller
/* On enregistre en base de données*/
$em->persist($Questions[$i]);
$em->flush();
/* Petit message de reussite, à traduire */
$request->getSession()->getFlashBag()->add('success', "Les modifications ont bien été enregistrées.");
}
// On doit rechercher la page sinon les nouvelles données ne seront pas affichées correctement (on aura celles avant enregistrement)
// On doit recharger la page sinon les nouvelles données ne seront pas affichées correctement (on aura celles avant enregistrement)
// Alors que les modifications auront bien été prises en compte
$request = $this->getRequest();
return $this->redirect($request->getUri());
}
}
else {
// Dire qu'il n'y a pas de question
/* Petit message de reussite, à traduire */
$request->getSession()->getFlashBag()->add('alert', "L'étape ne contient aucune question.");
return $this->redirectToRoute('pedagogicalscenario_design', array('id' => $pedagogicalScenario->getId(), 'userRole' => $this->get('security.context')->getToken()->getUser()->getRoleForRouter()));
}
return $this->render('ScenarioBundle:pedagogicalscenario:stagequestionsanswersedit.html.twig', array(
......@@ -609,62 +657,63 @@ class PedagogicalScenarioController extends Controller
}
private function removeNullElementsEndOfTab($tab)
/* Cette fonction a pour objectif de retirer les "null" du tableau de réponse et de correctement le reconstituer */
private function removeNullElementsEndOfTab($tab,$typeTableau)
{
if (!empty($tab))
{
end($tab);
$indiceCourant = sizeof($tab);
if ($typeTableau == "sequence")
$nbColEffective = 2;
else
$nbColEffective = 3;
$termine = false;
if (sizeof($tab)-$nbColEffective >= 0)
{
$newTab = array();
while($termine == false && sizeof($tab) > 0)
{
if ($indiceCourant % 2 == 0)
for ($i=0 ; $i < sizeof($tab) ; $i+=$nbColEffective)
{
if($tab[key($tab)] == null)
if ($tab[$i] != null || $tab[$i+1] != null)
{
prev($tab);
if($tab[key($tab)] == null)
{
$cle1 = key($tab);
next($tab);
$cle2 = key($tab);
prev($tab);
prev($tab);
unset($tab[$cle1]);
unset($tab[$cle2]);
}
else
{
$termine = true;
}
array_push($newTab,$tab[$i], $tab[$i+1]);
}
else
{
$termine = true;
}
$indiceCourant-=2;
}
else
}
return $newTab;
}
/* Cette fonction a pour objectif de retirer les "null" du tableau de réponse sequence */
private function removeNullElementsSequenceTab($tab)
{
if (sizeof($tab)-2 >= 0)
{
$newTab = array();
for ($i=0 ; $i < sizeof($tab) ; $i+=2)
{
if($tab[key($tab)] == null)
if ($tab[$i] != null || $tab[$i+1] != null)
{
$cle = key($tab);
prev($tab);
unset($tab[$cle]);
array_push($newTab,$tab[$i], $tab[$i+1]);
}
else
}
}
return $newTab;
}
/* Cette fonction a pour objectif de retirer les "null" du tableau de réponse séance */
private function removeNullElementsSessionTab($tab)
{
if (sizeof($tab)-3 >= 0)
{
$newTab = array();
for ($i=0 ; $i < sizeof($tab) ; $i+=3)
{
if ($tab[$i] != null || $tab[$i+1] != null || $tab[$i+2] != null)
{
$termine = true;
array_push($newTab,$tab[$i], $tab[$i+1], $tab[$i+2]);
}
$indiceCourant--;
}
}
}
return $tab;
return $newTab;
}
private function createBreadcrumb($currentAction, $pedagogicalScenario = null, $scenarisationStage = null)
......
......@@ -138,6 +138,8 @@ class ProjectController extends Controller
$em->flush();
}
/* Petit message de reussite, à traduire */
$request->getSession()->getFlashBag()->add('success', "Le projet '" . $project->getShortname() . "' a bien été supprimé.");
return $this->redirectToRoute('project_index', array('userRole' => 'pedagogical-engineer'));
}
......
......@@ -136,6 +136,8 @@ class TrainingCourseController extends Controller
$em->flush();
}
/* Petit message de reussite, à traduire */
$request->getSession()->getFlashBag()->add('success', "La formation '" . $trainingCourse->getShortname() . "' a bien été supprimée.");
return $this->redirectToRoute('training_course_index', array('userRole' => 'pedagogical-engineer'));
}
......
......@@ -127,7 +127,7 @@ class SequenceAnswer extends Answer
*
* @param Array $sequencesArray
*
* @return SequenceAnswer
* @return SequencesArray
*/
public function setSequencesArray($sequencesArray)
{
......
......@@ -27,6 +27,13 @@ class SessionAnswer extends Answer
*/
private $sessionQuestion;
/**
* @var array
*
* @ORM\Column(name="sessionsarray", type="array", nullable=true)
*/
private $sessionsArray;
/**
* @ORM\OneToMany(targetEntity="ScenarioBundle\Entity\Session", mappedBy="sessionAnswer", cascade={"persist"})
* @ORM\JoinColumn(nullable=true)
......@@ -105,4 +112,28 @@ class SessionAnswer extends Answer
return $this->sessions;
}
/**
* Get sessionsArray
*
* @return array
*/
public function getSessionsArray()
{
return $this->sessionsArray;
}
/**
* Set sessionsArray
*
* @param Array $sessionsArray
*
* @return SessionsArray
*/
public function setSessionsArray($sessionsArray)
{
$this->sessionsArray = $sessionsArray;
return $this;
}
}
......@@ -21,7 +21,9 @@
{{ form_start(delete_form) }}
{# Bouton supprimer #}
<i class="fa fa-trash-o" aria-hidden="true"></i>
<input style="cursor: pointer;" data-toggle="modal" data-target="#confirmDelete" data-title="{{'Delete.pedagogicalScenario.title'|trans}}" data-message="{{'Delete.pedagogicalScenario.sentence'|trans}}{{pedagogicalScenario.shortname}} ?" class="boutonSansBordure" value="{{'delete'|trans}}">
<input style="cursor: pointer;" data-toggle="modal" data-target="#confirmDelete"
data-title="{{'Delete.pedagogicalScenario.title'|trans}}" data-message="{{'Delete.pedagogicalScenario.sentence'|trans}}: {{pedagogicalScenario.shortname}} ?"
class="boutonSansBordure" value="{{'delete'|trans}}">
{{ form_end(delete_form) }}
</h4>
</div>
......
{% extends 'base.html.twig' %}
{# The displayed language of the questions is choosen with the current locale #}
{% set locale = app.request.locale %}
......@@ -16,41 +15,51 @@
{% block viewSubTitle %}{{pedagogicalScenario.shortname}} - {{scenarisationStage.title}}{% endblock %}
{% block body %}
<link rel="stylesheet" href="{{ asset('css/dynamicSequenceTab.css')}}">
{% if questions is not empty %}
<script src="{{ asset('js/dynamicsTabs.js')}}"></script>
<link rel="stylesheet" href="{{ asset('css/dynamicSequenceTabb.css')}}">
{% if submit %}
<div style="max-width : 300px;" class="alert alert-success" role="alert"> Données correctement enregistrées</div>
{% endif %}
{% if questions is not empty %}
<form method="post" {{ form_enctype(formulaireReponses) }}>
{# Pour chacune des questions de l'étape #}
{% for questionOrder in questions %}
<div id="container">
{# On affiche l'intitulé de la question dans la locale courante #}
<b>#{{ questionOrder.position}} - {{ attribute(questionOrder.question, localeWording) }}</b>
<br />
<br />
{# On affiche le champ de saisie de la réponse #}
{% if questionOrder.question.getType == 'generalQuestion' %}
{{ form_widget(formulaireReponses["answer_" ~ loop.index0]) }}
{% elseif questionOrder.question.getType == 'sequenceQuestion' %}
<div id="sequenceQuestion">
<div {{form_enctype(formulaireReponses["answer_" ~ loop.index0])}}>
{{ form_widget(formulaireReponses["answer_" ~ loop.index0]) }}
<div id="sequenceQuestion">
<div {{form_enctype(formulaireReponses["answer_" ~ loop.index0])}}>
{{ form_widget(formulaireReponses["answer_" ~ loop.index0]) }}
</div>
</div>
</div>
<table id="tableauSequences">
</table>
<button type="button" onclick="ajouter()">Ajouter!</button>
<table id="tableauSequences" class="table-bordered" style="width: 100%;"></table>
<button type="button" onclick="ajouterLigne('tableauSequences',3)">Ajouter!</button>
<script type="text/javascript">initSeqTab();</script>
{% elseif questionOrder.question.getType == 'sessionQuestion' %}
<div id="sessionQuestion" onload="alert('toto')">
<div {{form_enctype(formulaireReponses["answer_" ~ loop.index0])}}>
{{ form_widget(formulaireReponses["answer_" ~ loop.index0]) }}
</div>
</div>
<table id="tableauSeances" class="table-bordered" style="width: 100%;"></table>
<button type="button" onclick="ajouterLigne('tableauSeances',4)">Ajouter!</button>
<script type="text/javascript">initSessTab();</script>
{% endif %}
<br/>
{{ form_widget(formulaireReponses["isValid_" ~ loop.index0]) }}
......@@ -75,160 +84,4 @@
{% else %}
<p><i>Aucune question associée à l'étape courante.</i></p>
{% endif %}
<script>
var modeleDataPrototype = $('div#sequenceQuestion').children().children().attr('data-prototype');
var nbLignes = 0;
var nbItem = 0; // Il s'agit du nombre de cases
creertableau();
recupereDonnees();
supprimerConneriesSymfony();
function creertableau()
{
// Creation du tbody
var tbody = document.createElement("tbody");
document.getElementById('tableauSequences').appendChild(tbody);
// Creation de la ligne d'entete
var entete = document.createElement("tr");
entete.setAttribute("id","entete");
//document.getElementById('tableauSequences').appendChild(entete);
tbody.appendChild(entete);
// Dans l'entete, on ajoute les 4 cases
var case1 = document.createElement("th");
case1.setAttribute("id","c1_l1");
case1.innerHTML = "Title";
//document.getElementById('entete').appendChild(case1);
document.getElementById('entete').appendChild(case1);
var case2 = document.createElement("th");
case2.setAttribute("id","c2_l1");
case2.innerHTML = "Duration";
document.getElementById('entete').appendChild(case2);
var case3 = document.createElement("th");
case3.setAttribute("id","c3_l1");
case3.innerHTML = "Gestion";
document.getElementById('entete').appendChild(case3);
}
function creerLigne()
{
nouvelleLigne = document.getElementById("tableauSequences").insertRow();
nbLignes++;
nouvelleLigne.insertCell();
nouvelleLigne.insertCell();
nouvelleLigne.insertCell();
mettreBoutonsGestionLigne(nouvelleLigne);
return nouvelleLigne;