From e941cf182216501191e12c5376362ed5fb40b430 Mon Sep 17 00:00:00 2001
From: Olivier PEREZ <olivier@olivierperez.fr>
Date: Tue, 16 Dec 2014 00:45:16 +0100
Subject: [PATCH] Add availability to edit a vote

---
 app/classes/Framadate/FramaDB.php |  5 ++++
 studs.php                         | 38 +++++++++++++++++++++++++++++--
 tpl/studs.tpl                     | 11 ++++-----
 3 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/app/classes/Framadate/FramaDB.php b/app/classes/Framadate/FramaDB.php
index 0869fcb1..12fc08e1 100644
--- a/app/classes/Framadate/FramaDB.php
+++ b/app/classes/Framadate/FramaDB.php
@@ -85,4 +85,9 @@ class FramaDB
         return $newVote;
     }
 
+    function updateVote($poll_id, $vote_id, $choices) {
+        $prepared = $this->prepare('UPDATE user_studs SET reponses = ? WHERE id_sondage = ? AND id_users = ?');
+        return $prepared->execute([$choices, $poll_id, $vote_id]);
+    }
+
 }
diff --git a/studs.php b/studs.php
index 185c91b6..f638ac59 100644
--- a/studs.php
+++ b/studs.php
@@ -17,6 +17,7 @@
  * Auteurs de Framadate/OpenSondage : Framasoft (https://github.com/framasoft)
  */
 use Framadate\Services\PollService;
+use Framadate\Utils;
 
 include_once __DIR__ . '/app/inc/init.php';
 
@@ -74,7 +75,7 @@ $pollService = new PollService($connect);
 /* ---- */
 
 if(!empty($_GET['poll'])) {
-    $poll_id = $_GET['poll'];
+    $poll_id = filter_input(INPUT_GET, 'poll', FILTER_VALIDATE_REGEXP, ['options'=>['regexp'=>'/^[a-z0-9]+$/']]);
 }
 
 
@@ -86,11 +87,44 @@ if (!$poll) {
     exit;
 }
 
+// A vote is going to be edited
+if (!empty($_POST['edit_vote'])) {
+    // TODO Try what does filter_input with a wrong value
+    $editingVoteId = filter_input(INPUT_POST, 'edit_vote', FILTER_VALIDATE_INT);
+} else {
+    $editingVoteId = 0;
+}
+
+
+if (!empty($_POST['save'])) { // Save edition of an old vote
+    $editedVote = filter_input(INPUT_POST, 'save', FILTER_VALIDATE_INT);
+    $newChoices = [];
+
+    // TODO Do this verification into a Service (maybe called 'InputService')
+    foreach($_POST['choices'] as $id=>$choice) {
+        $choice = filter_var($choice, FILTER_VALIDATE_REGEXP, ['options'=>['regexp'=>'/^[012]$/']]);
+        if ($choice !== false) {
+            $newChoices[$id] = $choice;
+        }
+    }
+
+    if (count($newChoices) == count($_POST['choices'])) {
+        $result = $pollService->updatePoll($poll_id, $editedVote, $newChoices);
+        if ($result) {
+            $message = ['type'=>'success', 'message'=>_('Update vote successfully!')];
+        } else {
+            $message = ['type'=>'success', 'message'=>_('Update vote successfully!')];
+        }
+    }
+} elseif (isset($_POST[''])) { // Add a new vote
+}
+
 // Retrieve data
 $slots = $pollService->allSlotsByPollId($poll_id);
 $votes = $pollService->allUserVotesByPollId($poll_id);
 $comments = $pollService->allCommentsByPollId($poll_id);
 
+
 // Assign data to template
 $smarty->assign('poll_id', $poll_id);
 $smarty->assign('poll', $poll);
@@ -99,7 +133,7 @@ $smarty->assign('slots', split_slots($slots));
 $smarty->assign('votes', split_votes($votes));
 $smarty->assign('best_moments', computeBestMoments($votes));
 $smarty->assign('comments', $comments);
-$smarty->assign('editingVoteId', 0); // TODO Replace by the right ID
+$smarty->assign('editingVoteId', $editingVoteId);
 
 //Utils::debug(computeBestMoments($votes));exit;
 
diff --git a/tpl/studs.tpl b/tpl/studs.tpl
index a26d97e5..57d2f866 100644
--- a/tpl/studs.tpl
+++ b/tpl/studs.tpl
@@ -115,27 +115,27 @@
                             <td class="bg-info" headers="'.$td_headers[$k].'">
                                 <ul class="list-unstyled choice">
                                     <li class="yes">
-                                        <input type="radio" id="y-choice-{$k}" name="choice{$k}" value="2" {if $choice==2}checked {/if}/>
+                                        <input type="radio" id="y-choice-{$k}" name="choices[{$k}]" value="2" {if $choice==2}checked {/if}/>
                                         <label class="btn btn-default btn-xs" for="y-choice-{$k}" title="{_('Vote yes for ')} . $radio_title[$k] . '">
                                             <span class="glyphicon glyphicon-ok"></span><span class="sr-only">{_('Yes')}</span>
                                         </label>
                                     </li>
                                     <li class="ifneedbe">
-                                        <input type="radio" id="i-choice-{$k}" name="choice{$k}" value="1" {if $choice==1}checked {/if}/>
+                                        <input type="radio" id="i-choice-{$k}" name="choices[{$k}]" value="1" {if $choice==1}checked {/if}/>
                                         <label class="btn btn-default btn-xs" for="i-choice-{$k}" title="{_('Vote ifneedbe for ')} . $radio_title[$k] . '">
                                             (<span class="glyphicon glyphicon-ok"></span>)<span class="sr-only">{_('Ifneedbe')}</span>
                                         </label>
                                     </li>
                                     <li class="no">
-                                        <input type="radio" id="n-choice-{$k}" name="choice{$k}" value="0" {if $choice==0}checked {/if}/>
+                                        <input type="radio" id="n-choice-{$k}" name="choices[{$k}]" value="0" {if $choice==0}checked {/if}/>
                                         <label class="btn btn-default btn-xs" for="n-choice-{$k}" title="{_('Vote no for ')} . $radio_title[$k] . '">
                                             <span class="glyphicon glyphicon-ban-circle"></span><span class="sr-only">{_('No')}</span>
                                         </label>
                                     </li>
                                 </ul>
                             </td>
-                            <td></td>
                         {/foreach}
+                        <td style="padding:5px"><button type="submit" class="btn btn-success btn-xs" name="save" value="{$vote->id}" title="{_('Save the choices')} {$vote->name}">{_('Save')}</button></td>
                     {else}
 
                         {* Voted line *}
@@ -154,8 +154,7 @@
 
                         {if $poll->active && $poll->editable}
                             <td>
-                                <input type="hidden" name="edit_vote" value="{$vote->id}"/>
-                                <button type="submit" class="btn btn-link btn-sm" name="edit_vote" title="{_('Edit the line:')} {$vote->name}">
+                                <button type="submit" class="btn btn-link btn-sm" name="edit_vote" value="{$vote->id}" title="{_('Edit the line:')} {$vote->name}">
                                     <span class="glyphicon glyphicon-pencil"></span><span class="sr-only">{_('Edit')}</span>
                                 </button>
                             </td>
-- 
GitLab