Browse code

[Bugfix] Do not use protected groups as group selection for member list and reader

Sebastian Zoglowek authored on27/02/2022 22:18:49
Showing3 changed files
... ...
@@ -21,8 +21,8 @@ use Contao\Controller;
21 21
 array_insert($GLOBALS['TL_DCA']['tl_module']['palettes'], 0, [
22 22
     'avatar' => '{title_legend},name,headline,type;{source_legend},imgSize;{template_legend:hide},memberTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
23 23
     '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},groups,memberFields,imgSize;{redirect_legend},jumpTo;{template_legend:hide},customTpl,memberListTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
25
-    'memberReader' => '{title_legend},name,headline,type;{config_legend},groups,memberFields,imgSize;{template_legend:hide},customTpl,memberReaderTpl;{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',
25
+    '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 26
 ]);
27 27
 
28 28
 $GLOBALS['TL_DCA']['tl_module']['fields']['memberListTpl'] = [
... ...
@@ -49,6 +49,15 @@ $GLOBALS['TL_DCA']['tl_module']['fields']['memberFields'] = [
49 49
     'sql' => "blob NULL"
50 50
 ];
51 51
 
52
+$GLOBALS['TL_DCA']['tl_module']['fields']['ext_groups'] = [
53
+    'exclude' => true,
54
+    'inputType' => 'checkbox',
55
+    'foreignKey' => 'tl_member_group.name',
56
+    'eval' => ['multiple'=>true],
57
+    'sql' => "blob NULL",
58
+    'relation' => ['type'=>'hasMany', 'load'=>'lazy']
59
+];
60
+
52 61
 class tl_module_extension extends Backend
53 62
 {
54 63
     /**
... ...
@@ -24,7 +24,9 @@ use Contao\System;
24 24
 /**
25 25
  * Class ModuleMemberList
26 26
  *
27
- * @author Daniele Sciannimanica <https://github.com/doishub>
27
+ * @property string $ext_groups considered member groups
28
+ * @property string $memberFields Fields to be displayed
29
+ * @property string $memberListTpl Frontend list template
28 30
  */
29 31
 class ModuleMemberList extends ModuleMemberExtension
30 32
 {
... ...
@@ -70,17 +72,30 @@ class ModuleMemberList extends ModuleMemberExtension
70 72
 	 */
71 73
 	protected function compile()
72 74
 	{
73
-        $objGroups = MemberModel::findAll();
74
-        $arrGroups = StringUtil::deserialize($this->groups);
75
-        $arrMembers = null;
75
+        $arrGroups = StringUtil::deserialize($this->ext_groups);
76 76
 
77
-        if($objGroups->count())
77
+        if(empty($arrGroups) || !\is_array($arrGroups))
78 78
         {
79
-            while($objGroups->next())
79
+            $this->Template->empty = $GLOBALS['TL_LANG']['MSC']['emptyMemberList'];
80
+            return;
81
+        }
82
+
83
+        $objMembers = MemberModel::findAll();
84
+        $arrMembers = [];
85
+
86
+        if($objMembers->count())
87
+        {
88
+            while($objMembers->next())
80 89
             {
81
-                $memberGroups = StringUtil::deserialize($objGroups->groups);
90
+                // Skip disabled users instantly
91
+                if($objMembers->disable)
92
+                {
93
+                    continue;
94
+                }
95
+
96
+                $memberGroups = StringUtil::deserialize($objMembers->groups);
82 97
 
83
-                if($objGroups->disable || empty($arrGroups) || !\is_array($arrGroups) || !\count(array_intersect($arrGroups, $memberGroups)))
98
+                if(!\count(array_intersect($arrGroups, $memberGroups)))
84 99
                 {
85 100
                     continue;
86 101
                 }
... ...
@@ -88,9 +103,9 @@ class ModuleMemberList extends ModuleMemberExtension
88 103
                 $arrMemberFields = StringUtil::deserialize($this->memberFields, true);
89 104
 
90 105
                 $objTemplate = new FrontendTemplate($this->memberListTpl ?: $this->strMemberTemplate);
91
-                $objTemplate->setData($objGroups->current()->row());
106
+                $objTemplate->setData($objMembers->current()->row());
92 107
 
93
-                $arrMembers[] = $this->parseMemberTemplate($objGroups->current(), $objTemplate, $arrMemberFields, $this->imgSize);
108
+                $arrMembers[] = $this->parseMemberTemplate($objMembers->current(), $objTemplate, $arrMemberFields, $this->imgSize);
94 109
             }
95 110
         }
96 111
 
... ...
@@ -27,8 +27,10 @@ use Contao\System;
27 27
 
28 28
 /**
29 29
  * Class ModuleMemberList
30
- *
31
- * @author Daniele Sciannimanica <https://github.com/doishub>
30
+ * 
31
+ * @property string $ext_groups considered member groups
32
+ * @property string $memberFields Fields to be displayed
33
+ * @property string $memberReaderTpl Frontend reader template
32 34
  */
33 35
 class ModuleMemberReader extends ModuleMemberExtension
34 36
 {
... ...
@@ -86,14 +88,14 @@ class ModuleMemberReader extends ModuleMemberExtension
86 88
         // Get the member
87 89
         $objMember = MemberModel::findByIdOrAlias(Input::get('items'));
88 90
 
89
-        // The member does not exist
91
+        // The member does not exist and is not deactivated
90 92
         if ($objMember === null || $objMember->disable)
91 93
         {
92 94
             throw new PageNotFoundException('Page not found: ' . Environment::get('uri'));
93 95
         }
94 96
 
95
-        // Check groups
96
-        $arrGroups = StringUtil::deserialize($this->groups);
97
+        // Check for group intersection
98
+        $arrGroups = StringUtil::deserialize($this->ext_groups);
97 99
         $memberGroups = StringUtil::deserialize($objMember->groups);
98 100
 
99 101
         if (empty($arrGroups) || !\is_array($arrGroups) || !\count(array_intersect($arrGroups, $memberGroups)))