Browse code

[Update] Add possibility to sort member list by a specific field (See: #4 )

Sebastian Zoglowek authored on28/02/2022 00:48:19
Showing6 changed files
... ...
@@ -15,13 +15,16 @@ declare(strict_types=1);
15 15
 
16 16
 use Contao\Backend;
17 17
 use Contao\Controller;
18
+use Contao\System;
19
+
20
+System::loadLanguageFile('tl_member_settings');
18 21
 
19 22
 // Add palettes to tl_module
20 23
 // ToDo: Change to ArrayUtil::arrayInsert in the future
21 24
 array_insert($GLOBALS['TL_DCA']['tl_module']['palettes'], 0, [
22 25
     'avatar' => '{title_legend},name,headline,type;{source_legend},imgSize;{template_legend:hide},memberTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
23 26
     'deleteAvatar' => '{title_legend},name,headline,type;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
24
-    'memberList' => '{title_legend},name,headline,type;{config_legend},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,ext_groups,memberFields,imgSize;{redirect_legend},jumpTo;{template_legend:hide},customTpl,memberListTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
25 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'
26 29
 ]);
27 30
 
... ...
@@ -41,11 +44,28 @@ $GLOBALS['TL_DCA']['tl_module']['fields']['memberReaderTpl'] = [
41 44
     'sql' => "varchar(64) NOT NULL default ''"
42 45
 ];
43 46
 
47
+$GLOBALS['TL_DCA']['tl_module']['fields']['ext_order'] = [
48
+    'exclude' => true,
49
+    'inputType' => 'select',
50
+    'options' => ['order_random', 'order_asc', 'order_desc'],
51
+    'reference' => &$GLOBALS['TL_LANG']['tl_member_settings'],
52
+    'eval' => ['tl_class'=>'w50 clr', 'includeBlankOption'=>true, 'chosen'=>true,],
53
+    'sql' => "varchar(32) NOT NULL default ''"
54
+];
55
+
56
+$GLOBALS['TL_DCA']['tl_module']['fields']['ext_orderField'] = [
57
+    'exclude' => true,
58
+    'inputType' => 'select',
59
+    'options_callback' => ['tl_module_extension', 'getViewableMemberFields'],
60
+    'eval' => ['tl_class'=>'w50', 'includeBlankOption'=>true, 'chosen'=>true,],
61
+    'sql' => "varchar(32) NOT NULL default ''"
62
+];
63
+
44 64
 $GLOBALS['TL_DCA']['tl_module']['fields']['memberFields'] = [
45 65
     'exclude' => true,
46 66
     'inputType' => 'checkboxWizard',
47 67
     'options_callback' => ['tl_module_extension', 'getMemberProperties'],
48
-    'eval' => ['multiple'=>true],
68
+    'eval' => ['multiple'=>true, 'tl_class'=>'clr'],
49 69
     'sql' => "blob NULL"
50 70
 ];
51 71
 
... ...
@@ -53,7 +73,7 @@ $GLOBALS['TL_DCA']['tl_module']['fields']['ext_groups'] = [
53 73
     'exclude' => true,
54 74
     'inputType' => 'checkbox',
55 75
     'foreignKey' => 'tl_member_group.name',
56
-    'eval' => ['multiple'=>true],
76
+    'eval' => ['multiple'=>true, 'tl_class'=>'clr'],
57 77
     'sql' => "blob NULL",
58 78
     'relation' => ['type'=>'hasMany', 'load'=>'lazy']
59 79
 ];
... ...
@@ -108,4 +128,27 @@ class tl_module_extension extends Backend
108 128
 
109 129
         return $return;
110 130
     }
131
+
132
+    /**
133
+     * Return all sortable fields of table tl_member
134
+     *
135
+     * @return array
136
+     */
137
+    public function getViewableMemberFields()
138
+    {
139
+        $return = [];
140
+
141
+        Contao\System::loadLanguageFile('tl_member');
142
+        $this->loadDataContainer('tl_member');
143
+
144
+        foreach ($GLOBALS['TL_DCA']['tl_member']['fields'] as $k=>$v)
145
+        {
146
+            if (!empty($v['inputType']) && $v['eval']['feViewable'] === true)
147
+            {
148
+                $return[$k] = $GLOBALS['TL_DCA']['tl_member']['fields'][$k]['label'][0] . ' ['.$k.']';
149
+            }
150
+        }
151
+
152
+        return $return;
153
+    }
111 154
 }
... ...
@@ -13,6 +13,18 @@
13 13
         <source>The default avatar is displayed for members who have not uploaded their own profile picture.</source>
14 14
         <target>Das Standard-Profilbild wird bei Mitgliedern angezeigt, welches kein eigenes Profilbild hochgeladen haben.</target>
15 15
       </trans-unit>
16
+      <trans-unit id="tl_member_settings.order_random">
17
+        <source>Random order</source>
18
+        <target>Zufällige Reihenfolge</target>
19
+      </trans-unit>
20
+      <trans-unit id="tl_member_settings.order_asc">
21
+        <source>Ascending</source>
22
+        <target>Aufsteigend</target>
23
+      </trans-unit>
24
+      <trans-unit id="tl_member_settings.order_desc">
25
+        <source>Descending</source>
26
+        <target>Absteigend</target>
27
+      </trans-unit>
16 28
     </body>
17 29
   </file>
18 30
 </xliff>
... ...
@@ -1,6 +1,22 @@
1 1
 <?xml version="1.0" ?><xliff version="1.1">
2 2
   <file datatype="php" original="src/Resources/contao/languages/en/tl_module.php" source-language="en" target-language="de">
3 3
     <body>
4
+      <trans-unit id="tl_module.ext_order.0">
5
+        <source>Sort order</source>
6
+        <target>Sortierreihenfolge</target>
7
+      </trans-unit>
8
+      <trans-unit id="tl_module.ext_order.1">
9
+        <source>Here you can choose the sort order.</source>
10
+        <target>Hier können Sie die Sortierreihenfolge festlegen.</target>
11
+      </trans-unit>
12
+      <trans-unit id="tl_module.ext_orderField.0">
13
+        <source>Sorting field</source>
14
+        <target>Sortierfeld</target>
15
+      </trans-unit>
16
+      <trans-unit id="tl_module.ext_orderField.1">
17
+        <source>Here you can select the field to be sorted by.</source>
18
+        <target>Hier können Sie das Feld auswählen, nach dem sortiert werden soll.</target>
19
+      </trans-unit>
4 20
       <trans-unit id="tl_module.ext_groups.0">
5 21
         <source>Groups to show</source>
6 22
         <target>Anzuzeigende Gruppen</target>
... ...
@@ -10,6 +10,15 @@
10 10
       <trans-unit id="tl_member_settings.defaultAvatar.1">
11 11
         <source>The default avatar is displayed for members who have not uploaded their own profile picture.</source>
12 12
       </trans-unit>
13
+      <trans-unit id="tl_member_settings.order_random">
14
+        <source>Random order</source>
15
+      </trans-unit>
16
+      <trans-unit id="tl_member_settings.order_asc">
17
+        <source>Ascending</source>
18
+      </trans-unit>
19
+      <trans-unit id="tl_member_settings.order_desc">
20
+        <source>Descending</source>
21
+      </trans-unit>
13 22
     </body>
14 23
   </file>
15 24
 </xliff>
... ...
@@ -1,6 +1,18 @@
1 1
 <?xml version="1.0" ?><xliff version="1.1">
2 2
   <file datatype="php" original="src/Resources/contao/languages/en/tl_module.php" source-language="en">
3 3
     <body>
4
+      <trans-unit id="tl_module.ext_order.0">
5
+        <source>Sort order</source>
6
+      </trans-unit>
7
+      <trans-unit id="tl_module.ext_order.1">
8
+        <source>Here you can choose the sort order.</source>
9
+      </trans-unit>
10
+      <trans-unit id="tl_module.ext_orderField.0">
11
+        <source>Sorting field</source>
12
+      </trans-unit>
13
+      <trans-unit id="tl_module.ext_orderField.1">
14
+        <source>Here you can select the field to be sorted by.</source>
15
+      </trans-unit>
4 16
       <trans-unit id="tl_module.ext_groups.0">
5 17
         <source>Groups to show</source>
6 18
       </trans-unit>
... ...
@@ -25,6 +25,8 @@ use Contao\System;
25 25
 /**
26 26
  * Class ModuleMemberList
27 27
  *
28
+ * @property string $ext_order order of list items
29
+ * @property string ext_orderField order field for list items
28 30
  * @property string $ext_groups considered member groups
29 31
  * @property string $memberFields Fields to be displayed
30 32
  * @property string $memberListTpl Frontend list template
... ...
@@ -122,6 +124,26 @@ class ModuleMemberList extends ModuleMemberExtension
122 124
         $arrOptions = [];
123 125
         $t = MemberModel::getTable();
124 126
 
127
+        if (!!$this->ext_orderField)
128
+        {
129
+            $arrOptions['order'] .= "$t.$this->ext_orderField ";
130
+        }
131
+
132
+        switch ($this->ext_order)
133
+        {
134
+            case 'order_random':
135
+                $arrOptions['order'] = "RAND()";
136
+                break;
137
+
138
+            case 'order_desc':
139
+                $arrOptions['order'] .= "DESC";
140
+                break;
141
+
142
+            case 'order_asc':
143
+            default:
144
+                break;
145
+        }
146
+
125 147
         return MemberModel::findBy(["$t.disable=''"], null, $arrOptions);
126 148
     }
127 149
 }