From f6a7a1c7bbe62fa1f4432b708ae58b0ea302971e Mon Sep 17 00:00:00 2001
From: Olivier PEREZ <olivier@olivierperez.fr>
Date: Sun, 18 Jan 2015 16:14:45 +0100
Subject: [PATCH] Issue #18 Install pagination on polls admin page

---
 admin/polls.php                               | 14 ++++++++++-
 app/classes/Framadate/FramaDB.php             | 25 ++++++++++++++++---
 .../Framadate/Services/SuperAdminService.php  |  9 ++++---
 app/inc/smarty.php                            |  1 +
 locale/de_DE/LC_MESSAGES/Studs.po             | 24 ++++++++++++++++++
 locale/en_GB/LC_MESSAGES/Studs.po             |  3 +++
 locale/fr_FR/LC_MESSAGES/Studs.po             |  3 +++
 tpl/admin/polls.tpl                           | 11 ++++++++
 8 files changed, 82 insertions(+), 8 deletions(-)

diff --git a/admin/polls.php b/admin/polls.php
index bf91aac3..71502e5b 100644
--- a/admin/polls.php
+++ b/admin/polls.php
@@ -27,6 +27,8 @@ use Framadate\Utils;
 include_once __DIR__ . '/../app/inc/init.php';
 include_once __DIR__ . '/../bandeaux.php';
 
+const POLLS_PER_PAGE = 10;
+
 /* Variables */
 /* --------- */
 
@@ -42,6 +44,11 @@ $adminPollService = new AdminPollService($connect, $pollService, $logService);
 $superAdminService = new SuperAdminService($connect);
 $securityService = new SecurityService();
 
+/* GET */
+/*-----*/
+$page = (int)filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
+$page = ($page >= 1) ? $page : 1;
+
 /* PAGE */
 /* ---- */
 
@@ -56,10 +63,15 @@ if (!empty($_POST['delete_confirm']) && $securityService->checkCsrf('admin', $_P
     $adminPollService->deleteEntirePoll($poll_id);
 }
 
-$polls = $superAdminService->findAllPolls();
+$found = $superAdminService->findAllPolls($page-1, POLLS_PER_PAGE);
+$polls = $found['polls'];
+$count = $found['count'];
 
 // Assign data to template
 $smarty->assign('polls', $polls);
+$smarty->assign('count', $count);
+$smarty->assign('page', $page);
+$smarty->assign('pages', ceil($count / POLLS_PER_PAGE));
 $smarty->assign('poll_to_delete', $poll_to_delete);
 $smarty->assign('log_file', is_readable('../' . LOG_FILE) ? LOG_FILE : null);
 $smarty->assign('crsf', $securityService->getToken('admin'));
diff --git a/app/classes/Framadate/FramaDB.php b/app/classes/Framadate/FramaDB.php
index 38d9b08f..6f500653 100644
--- a/app/classes/Framadate/FramaDB.php
+++ b/app/classes/Framadate/FramaDB.php
@@ -18,6 +18,8 @@
  */
 namespace Framadate;
 
+use PDO;
+
 class FramaDB {
     /**
      * PDO Object, connection to database.
@@ -274,11 +276,26 @@ class FramaDB {
         return $prepared->fetchAll();
     }
 
-    public function findAllPolls() {
-        $prepared = $this->prepare('SELECT * FROM ' . Utils::table('poll') . ' ORDER BY end_date ASC');
-        $prepared->execute([]);
+    /**
+     * @param $start int The index of the first poll to return
+     * @param $limit int The limit size
+     * @return array
+     */
+    public function findAllPolls($start, $limit) {
+        // Polls
+        $prepared = $this->prepare('SELECT * FROM ' . Utils::table('poll') . ' ORDER BY title ASC LIMIT :start, :limit');
+        $prepared->bindParam(':start', $start, PDO::PARAM_INT);
+        $prepared->bindParam(':limit', $limit, PDO::PARAM_INT);
+        $prepared->execute();
+        $polls = $prepared->fetchAll();
+
+        // Total count
+        $prepared = $this->prepare('SELECT count(1) nb FROM ' . Utils::table('poll'));
+        $prepared->execute();
+        $count = $prepared->fetch();
+        $prepared->closeCursor();
 
-        return $prepared->fetchAll();
+        return ['polls' => $polls, 'count' => $count->nb];
     }
 
     public function countVotesByPollId($poll_id) {
diff --git a/app/classes/Framadate/Services/SuperAdminService.php b/app/classes/Framadate/Services/SuperAdminService.php
index bea7b14a..af8a305b 100644
--- a/app/classes/Framadate/Services/SuperAdminService.php
+++ b/app/classes/Framadate/Services/SuperAdminService.php
@@ -19,10 +19,13 @@ class SuperAdminService {
     /**
      * Return the list of all polls.
      *
-     * @return array All the polls
+     * @param $page int The page index (O = first page)
+     * @param $limit int The limit size
+     * @return array ['polls' => The {$limit} polls, 'count' => Total count]
+     * polls, 'count' => Total count]
      */
-    public function findAllPolls() {
-        return $this->connect->findAllPolls();
+    public function findAllPolls($page, $limit) {
+        return $this->connect->findAllPolls($page * $limit, $limit);
     }
 
 }
diff --git a/app/inc/smarty.php b/app/inc/smarty.php
index 9cafbc87..6078fa69 100644
--- a/app/inc/smarty.php
+++ b/app/inc/smarty.php
@@ -27,6 +27,7 @@ $smarty->caching = false;
 
 $smarty->assign('APPLICATION_NAME', NOMAPPLICATION);
 $smarty->assign('SERVER_URL', Utils::get_server_name());
+$smarty->assign('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
 $smarty->assign('TITLE_IMAGE', IMAGE_TITRE);
 $smarty->assign('use_nav_js', file_exists($_SERVER['DOCUMENT_ROOT'] . '/nav/nav.js'));
 $smarty->assign('lang', $lang);
diff --git a/locale/de_DE/LC_MESSAGES/Studs.po b/locale/de_DE/LC_MESSAGES/Studs.po
index 3f8adcf7..9a89c9a6 100644
--- a/locale/de_DE/LC_MESSAGES/Studs.po
+++ b/locale/de_DE/LC_MESSAGES/Studs.po
@@ -610,6 +610,30 @@ msgstr "Umfrage ändern"
 msgid "Logs"
 msgstr "Verlauf"
 
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+msgid "Success"
+msgstr "Erfolg"
+
+msgid "Fail"
+msgstr "scheitern"
+
+msgid "Nothing"
+msgstr "Nichts"
+
+msgid "Succeeded:"
+msgstr "Erfolgreich:"
+
+msgid "Failed:"
+msgstr "fehlgeschlagen:"
+
+msgid "Skipped:"
+msgstr "übersprungene:"
+
+msgid "Pages:"
+msgstr "Seiten:"
+
 ########### Mails ###########
 # Mails studs.php
 msgid "Poll's participation"
diff --git a/locale/en_GB/LC_MESSAGES/Studs.po b/locale/en_GB/LC_MESSAGES/Studs.po
index 928ab8f5..d084ea48 100644
--- a/locale/en_GB/LC_MESSAGES/Studs.po
+++ b/locale/en_GB/LC_MESSAGES/Studs.po
@@ -664,6 +664,9 @@ msgstr "Failed:"
 msgid "Skipped:"
 msgstr "Skipped:"
 
+msgid "Pages:"
+msgstr "Pages:"
+
 ########### Mails ###########
 # Mails studs.php
 msgid "Poll's participation"
diff --git a/locale/fr_FR/LC_MESSAGES/Studs.po b/locale/fr_FR/LC_MESSAGES/Studs.po
index fe1efdbc..7cd490e0 100644
--- a/locale/fr_FR/LC_MESSAGES/Studs.po
+++ b/locale/fr_FR/LC_MESSAGES/Studs.po
@@ -664,6 +664,9 @@ msgstr "Échoué:"
 msgid "Skipped:"
 msgstr "Passé:"
 
+msgid "Pages:"
+msgstr "Pages :"
+
 ########### Mails ###########
 # Mails studs.php
 msgid "Poll's participation"
diff --git a/tpl/admin/polls.tpl b/tpl/admin/polls.tpl
index 30c773df..63e6bee9 100644
--- a/tpl/admin/polls.tpl
+++ b/tpl/admin/polls.tpl
@@ -60,5 +60,16 @@
                 </tr>
             {/foreach}
         </table>
+
+        <div>
+            {_('Pages:')}
+            {for $p=1 to $pages}
+                {if $p===$page}
+                    <a href="{$SERVER_URL}{$SCRIPT_NAME}?page={$p}" class="btn btn-danger" disabled="disabled">{$p}</a>
+                {else}
+                    <a href="{$SERVER_URL}{$SCRIPT_NAME}?page={$p}" class="btn btn-info">{$p}</a>
+                {/if}
+            {/for}
+        </div>
     </form>
 {/block}
\ No newline at end of file
-- 
GitLab