Commit 23bcb9ab authored by Patrick Etcheverry's avatar Patrick Etcheverry

Quelques verrous pour empêcher la modification de démarches/etapes/questions...

Quelques verrous pour empêcher la modification de démarches/etapes/questions quand il y a déjà une réponse initialisée
parent 9ce37ddb
......@@ -116,63 +116,75 @@ class QuestionController extends Controller
*/
public function editAction(Request $request, Question $question)
{
$em = $this->getDoctrine()->getManager();
// Avant de permettre l'édition il va falloir s'assurer que la question
// n'a pas déjà une réponse initialisée
if ($this->haveAlreadyAnAnswer($question) == false)
{
$em = $this->getDoctrine()->getManager();
// We generate the new breadcrumb
$this->createBreadcrumb("edit", $question);
// We generate the new breadcrumb
$this->createBreadcrumb("edit", $question);
// Mise en évidence du menu, changement du menu sélectionné
$deleteForm = $this->createDeleteForm($question);
// Mise en évidence du menu, changement du menu sélectionné
$deleteForm = $this->createDeleteForm($question);
/* On construit un tableau dans lequel les données du formulaire
seront recueillies */
$donneesFormulaireQuestion = array();
/* On construit un tableau dans lequel les données du formulaire
seront recueillies */
$donneesFormulaireQuestion = array();
/* On récupère les données déjà présentes */
$donneesFormulaireQuestion['enWording'] = $question->getEnWording();
$donneesFormulaireQuestion['frWording'] = $question->getFrWording();
$donneesFormulaireQuestion['esWording'] = $question->getEsWording();
$donneesFormulaireQuestion['type'] = $question->getType();
/* On récupère les données déjà présentes */
$donneesFormulaireQuestion['enWording'] = $question->getEnWording();
$donneesFormulaireQuestion['frWording'] = $question->getFrWording();
$donneesFormulaireQuestion['esWording'] = $question->getEsWording();
$donneesFormulaireQuestion['type'] = $question->getType();
$editForm = $this->createQuestionForm($donneesFormulaireQuestion);
$editForm = $this->createQuestionForm($donneesFormulaireQuestion);
$editForm->handleRequest($request);
$editForm->handleRequest($request);
if ($editForm->isSubmitted())
{
$donneesFormulaireQuestionRecuperees = $editForm->getData();
if ($editForm->isSubmitted())
{
$donneesFormulaireQuestionRecuperees = $editForm->getData();
if ($this->questionFormIsValid($donneesFormulaireQuestionRecuperees))
{
// Si le type de question n'a pas changé, on met juste à jour les 3 libellés
if ($question->getType() == $donneesFormulaireQuestionRecuperees['type'])
if ($this->questionFormIsValid($donneesFormulaireQuestionRecuperees))
{
$this->copyTabDataToAttributes($donneesFormulaireQuestionRecuperees,$question);
}
else // Il faut créer une nouvelle question est effacer l'ancienne
{
/* On supprime l'ancienne */
$em->remove($question);
// Si le type de question n'a pas changé, on met juste à jour les 3 libellés
if ($question->getType() == $donneesFormulaireQuestionRecuperees['type'])
{
$this->copyTabDataToAttributes($donneesFormulaireQuestionRecuperees,$question);
}
else // Il faut créer une nouvelle question est effacer l'ancienne
{
/* On supprime l'ancienne */
$em->remove($question);
$em->flush();
/* On crée la nouvelle question */
$question = $this->createQuestionEntityFromFormData($donneesFormulaireQuestionRecuperees);
}
$em->persist($question);
$em->flush();
/* On crée la nouvelle question */
$question = $this->createQuestionEntityFromFormData($donneesFormulaireQuestionRecuperees);
}
$em->persist($question);
$em->flush();
/* Pour qu'après la redirection il y ait un joli petite boîte de validation*/
$request->getSession()->getFlashBag()->add('success', 'La question a bien été modifiée.');
/* Pour qu'après la redirection il y ait un joli petite boîte de validation*/
$request->getSession()->getFlashBag()->add('success', 'La question a bien été modifiée.');
return $this->redirectToRoute('question_edit', array('id' => $question->getId()));
}
}
return $this->redirectToRoute('question_edit', array('id' => $question->getId()));
}
}
return $this->render('ScenarisationProcessBundle:question:edit.html.twig', array(
'question' => $question,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
}
else
{
/* Message d'erreur, à traduire */
$request->getSession()->getFlashBag()->add('alert', 'Impossible de modifier la question : elle possède déjà une réponse.');
return $this->render('ScenarisationProcessBundle:question:edit.html.twig', array(
'question' => $question,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
return $this->redirectToRoute('question_index');
}
}
/**
......@@ -358,4 +370,25 @@ class QuestionController extends Controller
}
}
private function haveAlreadyAnAnswer(Question $question)
{
/* On part du principe qu'il n'y a pas de réponse initialisée à la démarche */
$answerInitializedFound = false;
// Toutes les réponses
foreach ($question->getAnswers() as $key => $currentAnswer)
{
// Si on tombe sur une vraie réponse correctement initialisée
if($currentAnswer != null)
{
// On change l'état du booléen
$answerInitializedFound = true;
// On sort de la boucle
break;
}
}
// On retourne le booléen : Est ce qu'on a trouvé une réponse ou non
return $answerInitializedFound;
}
}
......@@ -214,22 +214,17 @@ class ScenarisationProcessController extends Controller
* Displays a drag&drop table to edit the scenarisation stages of a scenarisation process.
* @param ScenarisationProcess $scenarisationProcess
*/
public function stagesEditAction(Request $request, ScenarisationProcess $scenarisationProcess, $error = false)
public function stagesEditAction(Request $request, ScenarisationProcess $scenarisationProcess)
{
// We generate the new breadcrumb
$this->createBreadcrumb("stages_management", $scenarisationProcess);
// Mise en évidence du menu, changement du menu sélectionné
$this->updateMenu();
$entityManager = $this->get('doctrine')->getManager();
// Avant de permettre l'édition il va falloir s'assurer que la démarche n'est pas
// Déjà utilisée par des scénarios pédagogiques
$haveAlreadyAnAnswer = $entityManager->getRepository('ScenarisationProcessBundle:ScenarisationProcess')->haveAlreadyAnAnswer($scenarisationProcess);
if ($haveAlreadyAnAnswer == false)
// Déjà utilisée par des scénarios pédagogiques qui ont des réponses initialisées
if ($this->haveAlreadyAnAnswer($scenarisationProcess) == false)
{
$entityManager = $this->get('doctrine')->getManager();
// We generate the new breadcrumb
$this->createBreadcrumb("stages_management", $scenarisationProcess);
// Mise en évidence du menu, changement du menu sélectionné
$this->updateMenu();
// On récupère la liste des étapes (et leur position) pour la démarche courante
$etape_demarche_courante = $entityManager->createQuery ('
......@@ -257,14 +252,13 @@ class ScenarisationProcessController extends Controller
return $this->render('ScenarisationProcessBundle:scenarisationprocess:stagesEdit.html.twig', array(
'scenarisationProcess' => $scenarisationProcess,
'scenarisationStageOrders' => $scenarisationStageOrders,
'scenarisationStagesNotLinked' => $scenarisationStagesNotLinked,
'error' => $error
'scenarisationStagesNotLinked' => $scenarisationStagesNotLinked
));
}
else
{
/* Pour qu'après la redirection il y ait un joli petite boîte d'alerte */
$request->getSession()->getFlashBag()->add('alert', 'LA DEMARCHE NE PEUT ETRE MODIFIEE CAR DEJA UTILISEE PAR UN SCENARIO.');
/* Message d'erreur, à traduire */
$request->getSession()->getFlashBag()->add('alert', 'Impossible de modifier les étapes de la démarche : une question possède déjà une réponse.');
return $this->redirectToRoute('scenarisation_process_index');
}
......@@ -334,7 +328,8 @@ class ScenarisationProcessController extends Controller
}
else
{
$error = "1";
/* Message d'erreur, à traduire */
$request->getSession()->getFlashBag()->add('alert', 'Vous essayez d\'insérer une étape contenant une question séquence et/ou séance alors qu\'il y en a déjà une étape dans la démarche qui en contient une.');
}
# Si on vient de l'étape on renvoie à l'étape et si on vient de la démarche on renvoie vers la démarche
......@@ -493,4 +488,33 @@ class ScenarisationProcessController extends Controller
break;
}
}
private function haveAlreadyAnAnswer(ScenarisationProcess $scenarisationProcess)
{
/* On part du principe qu'il n'y a pas de réponse initialisée à la démarche */
$answerInitializedFound = false;
// On parcourt toutes les étapes
foreach ($scenarisationProcess->getScenarisationStageOrder() as $key => $currentScenarisationStageOrder)
{
// Toutes les questions
foreach ($currentScenarisationStageOrder->getScenarisationStage()->getQuestionOrder() as $key => $currentQuestionOrder)
{
// Toutes les réponses
foreach ($currentQuestionOrder->getQuestion()->getAnswers() as $key => $currentAnswer)
{
// Si on tombe sur une vraie réponse correctement initialisée
if($currentAnswer != null)
{
// On change l'état du booléen
$answerInitializedFound = true;
// On sort des 3 boucles imbriquées (d'où le '3')
break 3;
}
}
}
}
// On retourne le booléen : Est ce qu'on a trouvé une réponse ou non
return $answerInitializedFound;
}
}
......@@ -204,44 +204,55 @@ class ScenarisationStageController extends Controller
* Displays a drag&drop table to edit the questions of a scenarisation stage.
* @param ScenarisationStage $scenarisationStage
*/
public function questionsEditAction(ScenarisationStage $scenarisationStage, $already = false)
public function questionsEditAction(Request $request, ScenarisationStage $scenarisationStage)
{
// We generate the new breadcrumb
$this->createBreadcrumb("questions_management",$scenarisationStage);
// Mise en évidence du menu, changement du menu sélectionné
$this->updateMenu();
$entityManager = $this->get('doctrine')->getManager();
// Avant de permettre l'édition il va falloir s'assurer que l'étape n'est pas
// Déjà utilisée par des scénarios pédagogiques qui ont des réponses initialisées
if ($this->haveAlreadyAnAnswer($scenarisationStage) == false)
{
// We generate the new breadcrumb
$this->createBreadcrumb("questions_management",$scenarisationStage);
// Mise en évidence du menu, changement du menu sélectionné
$this->updateMenu();
$entityManager = $this->get('doctrine')->getManager();
// On récupère la liste des questions (et leur position) pour l'étape courante
$question_etape_courante = $entityManager->createQuery ('
select o,q
FROM ScenarisationProcessBundle:questionOrder o
JOIN o.question q
WHERE o.scenarisationStage = :scenarisationStage
ORDER BY o.position');
// On récupère toutes les autres questions, çad celles qui ne sont pas dans la démarche courante
$autres_questions = $entityManager->createQuery ('
select q
FROM ScenarisationProcessBundle:Question q
WHERE q NOT IN (select qo
FROM ScenarisationProcessBundle:QuestionOrder o
JOIN o.question qo
WHERE o.scenarisationStage = :scenarisationStage)');
$question_etape_courante->setParameter('scenarisationStage',$scenarisationStage);
$autres_questions->setParameter('scenarisationStage',$scenarisationStage);
$questionOrders = $question_etape_courante->getResult();
$questionsNotLinked = $autres_questions->getResult();
return $this->render('ScenarisationProcessBundle:scenarisationstage:questionsEdit.html.twig', array(
'scenarisationStage' => $scenarisationStage,
'questionOrders' => $questionOrders,
'questionsNotLinked' => $questionsNotLinked
));
}
else
{
/* Message d'erreur, à traduire */
$request->getSession()->getFlashBag()->add('alert', 'Impossible de modifier les questions de l\'étape : au moins une question possède déjà une réponse.');
// On récupère la liste des questions (et leur position) pour l'étape courante
$question_etape_courante = $entityManager->createQuery ('
select o,q
FROM ScenarisationProcessBundle:questionOrder o
JOIN o.question q
WHERE o.scenarisationStage = :scenarisationStage
ORDER BY o.position');
// On récupère toutes les autres questions, çad celles qui ne sont pas dans la démarche courante
$autres_questions = $entityManager->createQuery ('
select q
FROM ScenarisationProcessBundle:Question q
WHERE q NOT IN (select qo
FROM ScenarisationProcessBundle:QuestionOrder o
JOIN o.question qo
WHERE o.scenarisationStage = :scenarisationStage)');
$question_etape_courante->setParameter('scenarisationStage',$scenarisationStage);
$autres_questions->setParameter('scenarisationStage',$scenarisationStage);
$questionOrders = $question_etape_courante->getResult();
$questionsNotLinked = $autres_questions->getResult();
return $this->render('ScenarisationProcessBundle:scenarisationstage:questionsEdit.html.twig', array(
'scenarisationStage' => $scenarisationStage,
'questionOrders' => $questionOrders,
'questionsNotLinked' => $questionsNotLinked,
'already' => $already
));
return $this->redirectToRoute('scenarisation_stage_index');
}
}
/**
......@@ -293,7 +304,10 @@ class ScenarisationStageController extends Controller
}
else
{
return $this->redirectToRoute('scenarisation_stage_question_management', array('id' => $scenarisationStage->getId(), 'already' => true));
/* Message d'erreur, à traduire */
$request->getSession()->getFlashBag()->add('alert', 'Vous essayez d\'insérer une question séquence ou séance alors qu\'il y en a déjà une dans cette étape.');
return $this->redirectToRoute('scenarisation_stage_question_management', array('id' => $scenarisationStage->getId()));
}
}
......@@ -468,4 +482,29 @@ class ScenarisationStageController extends Controller
break;
}
}
private function haveAlreadyAnAnswer(scenarisationStage $scenarisationStage)
{
/* On part du principe qu'il n'y a pas de réponse initialisée à la démarche */
$answerInitializedFound = false;
// On parcourt toutes les questions
foreach ($scenarisationStage->getQuestionOrder() as $key => $currentQuestionOrder)
{
// Toutes les réponses
foreach ($currentQuestionOrder->getQuestion()->getAnswers() as $key => $currentAnswer)
{
// Si on tombe sur une vraie réponse correctement initialisée
if($currentAnswer != null)
{
// On change l'état du booléen
$answerInitializedFound = true;
// On sort des 2 boucles imbriquées (d'où le '2')
break 2;
}
}
}
// On retourne le booléen : Est ce qu'on a trouvé une réponse ou non
return $answerInitializedFound;
}
}
......@@ -43,24 +43,6 @@ class ScenarisationProcessRepository extends \Doctrine\ORM\EntityRepository
}
public function haveAlreadyAnAnswer(\ScenarisationProcessBundle\Entity\ScenarisationProcess $scenarisationProcess)
{
$gestionnaireEntite = $this->_em;
$qb = $gestionnaireEntite->createQuery('
SELECT count(pedagogicalScenarios)
FROM ScenarisationProcessBundle:ScenarisationProcess scenarisationProcess
JOIN scenarisationProcess.pedagogicalScenarios pedagogicalScenarios
WHERE scenarisationProcess = :scenarisationProcess');
$qb->setParameter('scenarisationProcess',$scenarisationProcess);
if ($qb->getResult()[0][1] == '0')
return false;
else
return true;
}
/* Retourne le nombre de démarches de scénarisation actuellement en bdd */
public function getNb()
{
......
......@@ -25,11 +25,9 @@ scenarisation_process_delete:
# This route show a view to manage the stages of a process (and their position)
scenarisation_process_stage_management:
path: /{id}/stages-edit/{error}
defaults: { _controller: "ScenarisationProcessBundle:ScenarisationProcess:stagesEdit", 'error': '0' }
path: /{id}/stages-edit/
defaults: { _controller: "ScenarisationProcessBundle:ScenarisationProcess:stagesEdit" }
methods: GET
requirements:
error: 1|0
# This route add a stage to a process
scenarisation_process_stage_add:
......
......@@ -25,8 +25,8 @@ scenarisation_stage_delete:
# This route show a view to manage the questions of a process (and their position)
scenarisation_stage_question_management:
path: /{id}/questions-edit/{already}
defaults: { _controller: "ScenarisationProcessBundle:ScenarisationStage:questionsEdit", already: false }
path: /{id}/questions-edit/
defaults: { _controller: "ScenarisationProcessBundle:ScenarisationStage:questionsEdit" }
methods: GET
# This route add a question to a stage
......
......@@ -27,13 +27,6 @@
<div class="panel-body">
{% if error %}
<div class="alert alert-danger">
<strong>Attention!</strong>
Vous essayez d'insérer une étape contenant une question séquence et/ou séance alors qu'il y en a déjà une étape dans la démarche qui en contient une.
</div>
{% endif %}
<p>{{'scenarisationProcess.stagesLinked'|trans}}</p>
{% if scenarisationStageOrders is not empty %}
<table class="table table-bordered sortable">
......
......@@ -37,13 +37,6 @@
<div class="panel-body">
{% if already %}
<div class="alert alert-danger">
<strong>Attention!</strong>
Vous essayez d'insérer une question séquence ou séance alors qu'il y en a déjà une dans cette étape.
</div>
{% endif %}
<br/>
<p>LISTE DES QUESTIONS CONTENUES DANS L'ETAPE :</p>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment