Browse code

[Update] Add pagination to member list

Sebastian Zoglowek authored on24/05/2022 22:53:25
Showing3 changed files
... ...
@@ -24,7 +24,7 @@ System::loadLanguageFile('tl_member_settings');
24 24
 array_insert($GLOBALS['TL_DCA']['tl_module']['palettes'], 0, [
25 25
     'avatar' => '{title_legend},name,headline,type;{source_legend},imgSize;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
26 26
     'deleteAvatar' => '{title_legend},name,headline,type;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
27
-    'memberList' => '{title_legend},name,headline,type;{config_legend},ext_order,ext_orderField,ext_groups,memberFields,imgSize;{redirect_legend},jumpTo;{template_legend:hide},customTpl,memberListTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
27
+    'memberList' => '{title_legend},name,headline,type;{config_legend},ext_order,ext_orderField,,numberOfItems,perPage,ext_groups,memberFields,imgSize;{redirect_legend},jumpTo;{template_legend:hide},customTpl,memberListTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
28 28
     'memberReader' => '{title_legend},name,headline,type;{config_legend},ext_groups,memberFields,imgSize;{template_legend:hide},customTpl,memberReaderTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID'
29 29
 ]);
30 30
 
... ...
@@ -16,9 +16,14 @@ declare(strict_types=1);
16 16
 namespace Oveleon\ContaoMemberExtensionBundle;
17 17
 
18 18
 use Contao\BackendTemplate;
19
+use Contao\Config;
20
+use Contao\CoreBundle\Exception\PageNotFoundException;
21
+use Contao\Environment;
19 22
 use Contao\FrontendTemplate;
23
+use Contao\Input;
20 24
 use Contao\MemberModel;
21 25
 use Contao\Model\Collection;
26
+use Contao\Pagination;
22 27
 use Contao\StringUtil;
23 28
 use Contao\System;
24 29
 
... ...
@@ -75,6 +80,9 @@ class ModuleMemberList extends ModuleMemberExtension
75 80
 	 */
76 81
 	protected function compile()
77 82
 	{
83
+        $limit = null;
84
+        $offset = 0;
85
+
78 86
         $arrGroups = StringUtil::deserialize($this->ext_groups);
79 87
 
80 88
         if(empty($arrGroups) || !\is_array($arrGroups))
... ...
@@ -86,6 +94,9 @@ class ModuleMemberList extends ModuleMemberExtension
86 94
         $objTemplate = new FrontendTemplate($this->memberListTpl ?: $this->strMemberTemplate);
87 95
 
88 96
         $objMembers = $this->getMembers();
97
+
98
+        $intTotal = 0;
99
+
89 100
         $arrMembers = [];
90 101
 
91 102
         if(null !== $objMembers)
... ...
@@ -99,6 +110,8 @@ class ModuleMemberList extends ModuleMemberExtension
99 110
                     continue;
100 111
                 }
101 112
 
113
+                $intTotal += 1;
114
+
102 115
                 $arrMemberFields = StringUtil::deserialize($this->memberFields, true);
103 116
                 $objTemplate->setData($objMember->row());
104 117
 
... ...
@@ -106,11 +119,48 @@ class ModuleMemberList extends ModuleMemberExtension
106 119
             }
107 120
         }
108 121
 
122
+        $total = $intTotal - $offset;
123
+
124
+        if ($this->numberOfItems > 0)
125
+        {
126
+            $limit = $this->numberOfItems;
127
+        }
128
+
129
+        if ($this->perPage > 0 && (!isset($limit) || $this->numberOfItems > $this->perPage))
130
+        {
131
+            if (isset($limit))
132
+            {
133
+                $total = min($limit, $total);
134
+            }
135
+
136
+            $id = 'page_n' . $this->id;
137
+            $page = Input::get($id) ?? 1;
138
+
139
+            if ($page < 1 || $page > max(ceil($total/$this->perPage), 1))
140
+            {
141
+                throw new PageNotFoundException('Page not found: ' . Environment::get('uri'));
142
+            }
143
+
144
+            $limit = $this->perPage;
145
+            $offset += (max($page, 1) - 1) * $this->perPage;
146
+            $skip = 0;
147
+
148
+            if ($offset + $limit > $total + $skip)
149
+            {
150
+                $limit = $total + $skip - $offset;
151
+            }
152
+
153
+            $objPagination = new Pagination($total, $this->perPage, Config::get('maxPaginationLinks'), $id);
154
+            $this->Template->pagination = $objPagination->generate("\n  ");
155
+        }
156
+
109 157
         if(empty($arrMembers))
110 158
         {
111 159
             $this->Template->empty = $GLOBALS['TL_LANG']['MSC']['emptyMemberList'];
112 160
         }
113 161
 
162
+        $arrMembers = \array_slice($arrMembers, $offset, ($limit ?: 0), true);
163
+
114 164
         $this->Template->members = $arrMembers;
115 165
 	}
116 166
 
... ...
@@ -2,12 +2,13 @@
2 2
 
3 3
 <?php $this->block('content'); ?>
4 4
 
5
-<?php if ($this->members): ?>
5
+<?php if (empty($this->members)): ?>
6
+    <p class="empty message"><?=$this->empty?></p>
7
+<?php else: ?>
6 8
     <?php foreach ($this->members as $member): ?>
7
-        <?=$member?>
9
+      <?=$member?>
8 10
     <?php endforeach; ?>
9
-<?php else: ?>
10
-    <p class="empty message"><?=$this->empty?></p>
11
+    <?= $this->pagination ?>
11 12
 <?php endif; ?>
12 13
 
13 14
 <?php $this->endblock(); ?>