Browse code

- Add module "MemberList" - Add module "MemberReader"

doishub authored on08/12/2020 15:39:30
Showing16 changed files
... ...
@@ -2,9 +2,10 @@
2 2
 Member Extension for Contao 4 Open Source CMS
3 3
 
4 4
 The following functions are added by this bundle:
5
-- Avatar-Upload (BE/FE)
6
-    - Avatar Default-Image
7
-- _More useful member extensions will follow..._
5
+- Avatar (BE/FE)
6
+    - Fallback / Default Image
7
+- Memberlist
8
+- Memberreader
8 9
 
9 10
 ### Avatar
10 11
 For the representation of the avatar, a separate module is provided. To prepare the avatar upload for the frontend, you only have to select the option "Avatar" in the module "Personal data".
... ...
@@ -16,4 +17,4 @@ For the representation of the avatar, a separate module is provided. To prepare
16 17
 ###### Member list
17 18
 ![Admin View: List](https://www.oveleon.de/share/github-assets/contao-member-extension-bundle/mebmer-extension-bundle-be-settings-1.png)
18 19
 ###### Member settings
19
-![Admin View: List](https://www.oveleon.de/share/github-assets/contao-member-extension-bundle/mebmer-extension-bundle-be-settings-2.png)
20 20
\ No newline at end of file
21
+![Admin View: List](https://www.oveleon.de/share/github-assets/contao-member-extension-bundle/mebmer-extension-bundle-be-settings-2.png)
... ...
@@ -5,6 +5,7 @@
5 5
  *
6 6
  * (c) https://www.oveleon.de/
7 7
  */
8
+
8 9
 // Back end modules
9 10
 $GLOBALS['BE_MOD']['system']['member_settings'] = array
10 11
 (
... ...
@@ -15,14 +16,16 @@ $GLOBALS['BE_MOD']['system']['member_settings'] = array
15 16
 // Front end modules
16 17
 array_insert($GLOBALS['FE_MOD']['user'], -1, array
17 18
 (
18
-    'avatar' => '\\Oveleon\\ContaoMemberExtensionBundle\\ModuleAvatar'
19
+    'avatar'       => 'Oveleon\ContaoMemberExtensionBundle\ModuleAvatar',
20
+    'memberList'   => 'Oveleon\ContaoMemberExtensionBundle\ModuleMemberList',
21
+    'memberReader' => 'Oveleon\ContaoMemberExtensionBundle\ModuleMemberReader'
19 22
 ));
20 23
 
21 24
 // Register hooks
22
-$GLOBALS['TL_HOOKS']['updatePersonalData'][] = array('\\Oveleon\\ContaoMemberExtensionBundle\\Member', 'updateAvatar');
25
+$GLOBALS['TL_HOOKS']['updatePersonalData'][] = array('Oveleon\ContaoMemberExtensionBundle\Member', 'updateAvatar');
23 26
 
24 27
 // Style sheet
25 28
 if (TL_MODE == 'BE')
26 29
 {
27 30
     $GLOBALS['TL_CSS'][] = 'bundles/contaomemberextension/style.css|static';
28
-}
29 31
\ No newline at end of file
32
+}
... ...
@@ -8,5 +8,97 @@
8 8
 
9 9
 array_insert($GLOBALS['TL_DCA']['tl_module']['palettes'], 0, array
10 10
 (
11
-    'avatar' => '{title_legend},name,headline,type;{source_legend},imgSize;{template_legend:hide},memberTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID'
11
+    'avatar'       => '{title_legend},name,headline,type;{source_legend},imgSize;{template_legend:hide},memberTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID',
12
+    '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',
13
+    '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'
12 14
 ));
15
+
16
+$GLOBALS['TL_DCA']['tl_module']['fields']['memberListTpl'] = array
17
+(
18
+    'exclude'                 => true,
19
+    'inputType'               => 'select',
20
+    'options_callback' => static function ()
21
+    {
22
+        return Contao\Controller::getTemplateGroup('member_list_');
23
+    },
24
+    'eval'                    => array('includeBlankOption'=>true, 'chosen'=>true, 'tl_class'=>'w50'),
25
+    'sql'                     => "varchar(64) NOT NULL default ''"
26
+);
27
+
28
+$GLOBALS['TL_DCA']['tl_module']['fields']['memberReaderTpl'] = array
29
+(
30
+    'exclude'                 => true,
31
+    'inputType'               => 'select',
32
+    'options_callback' => static function ()
33
+    {
34
+        return Contao\Controller::getTemplateGroup('member_reader_');
35
+    },
36
+    'eval'                    => array('includeBlankOption'=>true, 'chosen'=>true, 'tl_class'=>'w50'),
37
+    'sql'                     => "varchar(64) NOT NULL default ''"
38
+);
39
+
40
+$GLOBALS['TL_DCA']['tl_module']['fields']['memberFields'] = array
41
+(
42
+    'exclude'                 => true,
43
+    'inputType'               => 'checkboxWizard',
44
+    'options_callback'        => array('tl_module_extension', 'getMemberProperties'),
45
+    'eval'                    => array('multiple'=>true),
46
+    'sql'                     => "blob NULL"
47
+);
48
+
49
+
50
+/**
51
+ * Provide miscellaneous methods that are used by the data configuration array.
52
+ *
53
+ * @author Daniele Sciannimanica <https://github.com/doishub>
54
+ */
55
+class tl_module_extension extends Contao\Backend
56
+{
57
+    /**
58
+     * Import the back end user object
59
+     */
60
+    public function __construct()
61
+    {
62
+        parent::__construct();
63
+        $this->import('Contao\BackendUser', 'User');
64
+    }
65
+
66
+    /**
67
+     * Check permissions to edit the table
68
+     *
69
+     * @throws Contao\CoreBundle\Exception\AccessDeniedException
70
+     */
71
+    public function checkPermission()
72
+    {
73
+        if ($this->User->isAdmin) {
74
+            return;
75
+        }
76
+
77
+        if (!$this->User->hasAccess('modules', 'themes')) {
78
+            throw new Contao\CoreBundle\Exception\AccessDeniedException('Not enough permissions to access the front end modules module.');
79
+        }
80
+    }
81
+
82
+    /**
83
+     * Return all fields of table tl_member without account data
84
+     *
85
+     * @return array
86
+     */
87
+    public function getMemberProperties()
88
+    {
89
+        $return = array();
90
+
91
+        Contao\System::loadLanguageFile('tl_member');
92
+        $this->loadDataContainer('tl_member');
93
+
94
+        foreach ($GLOBALS['TL_DCA']['tl_member']['fields'] as $k=>$v)
95
+        {
96
+            if (!empty($v['inputType']) && $v['inputType'] !== 'password')
97
+            {
98
+                $return[$k] = $GLOBALS['TL_DCA']['tl_member']['fields'][$k]['label'][0];
99
+            }
100
+        }
101
+
102
+        return $return;
103
+    }
104
+}
13 105
new file mode 100644
... ...
@@ -0,0 +1,14 @@
1
+<?xml version="1.0" ?><xliff version="1.1">
2
+  <file datatype="php" original="src/Resources/contao/languages/en/default.php" source-language="en" target-language="de">
3
+    <body>
4
+      <trans-unit id="MSC.emptyMemberList">
5
+        <source>No members could be found.</source>
6
+        <target>Es konnten keine Mitglieder gefunden werden.</target>
7
+      </trans-unit>
8
+      <trans-unit id="MSC.memberDetail">
9
+        <source>More</source>
10
+        <target>Mehr</target>
11
+      </trans-unit>
12
+    </body>
13
+  </file>
14
+</xliff>
... ...
@@ -10,13 +10,29 @@
10 10
         <target>Mitglieder-Einstellungen vornehmen</target>
11 11
       </trans-unit>
12 12
       <trans-unit id="FMD.avatar.0">
13
-        <source>Profile picture</source>
14
-        <target>Profilbild</target>
13
+        <source>Profile picture / Avatar</source>
14
+        <target>Profilbild / Avatar</target>
15 15
       </trans-unit>
16 16
       <trans-unit id="FMD.avatar.1">
17 17
         <source>Displays the profile picture of the member.</source>
18 18
         <target>Zeigt das Profilbild des Mitgliedes an.</target>
19 19
       </trans-unit>
20
+      <trans-unit id="FMD.memberList.0">
21
+        <source>Memberlist</source>
22
+        <target>Mitgliederliste</target>
23
+      </trans-unit>
24
+      <trans-unit id="FMD.memberList.1">
25
+        <source>Displays a list of members.</source>
26
+        <target>Gibt eine Liste der Mitglieder aus.</target>
27
+      </trans-unit>
28
+      <trans-unit id="FMD.memberReader.0">
29
+        <source>Memberreader</source>
30
+        <target>Mitgliedleser</target>
31
+      </trans-unit>
32
+      <trans-unit id="FMD.memberReader.1">
33
+        <source>Displays a members details.</source>
34
+        <target>Gibt eine Details eines Mitglieds aus.</target>
35
+      </trans-unit>
20 36
     </body>
21 37
   </file>
22
-</xliff>
23 38
\ No newline at end of file
39
+</xliff>
24 40
new file mode 100644
... ...
@@ -0,0 +1,30 @@
1
+<?xml version="1.0" ?><xliff version="1.1">
2
+  <file datatype="php" original="src/Resources/contao/languages/en/tl_module.php" source-language="en" target-language="de">
3
+    <body>
4
+      <trans-unit id="tl_module.memberFields.0">
5
+        <source>Member fields</source>
6
+        <target>Mitglied-Felder</target>
7
+      </trans-unit>
8
+      <trans-unit id="tl_module.memberFields.1">
9
+        <source>Here you can make a selection of the fields that will be output.</source>
10
+        <target>Hier können Sie eine Auswhal der Felder treffen, welche ausgegeben werden.</target>
11
+      </trans-unit>
12
+      <trans-unit id="tl_module.memberListTpl.0">
13
+        <source>List-Template</source>
14
+        <target>Listen-Template</target>
15
+      </trans-unit>
16
+      <trans-unit id="tl_module.memberListTpl.1">
17
+        <source>Here you can choose your own member list template.</source>
18
+        <target>Hier können Sie ein eigenes Mitglieder-Listen Template wählen.</target>
19
+      </trans-unit>
20
+      <trans-unit id="tl_module.memberReaderTpl.0">
21
+        <source>Reader-Template</source>
22
+        <target>Leser-Template</target>
23
+      </trans-unit>
24
+      <trans-unit id="tl_module.memberReaderTpl.1">
25
+        <source>Here you can choose your own member reader template.</source>
26
+        <target>Hier können Sie ein eigenes Mitglied-Leser Template wählen.</target>
27
+      </trans-unit>
28
+    </body>
29
+  </file>
30
+</xliff>
0 31
new file mode 100644
... ...
@@ -0,0 +1,12 @@
1
+<?xml version="1.0" ?><xliff version="1.1">
2
+  <file datatype="php" original="src/Resources/contao/languages/en/default.php" source-language="en">
3
+    <body>
4
+      <trans-unit id="MSC.emptyMemberList">
5
+        <source>No members could be found.</source>
6
+      </trans-unit>
7
+      <trans-unit id="MSC.memberDetail">
8
+        <source>More</source>
9
+      </trans-unit>
10
+    </body>
11
+  </file>
12
+</xliff>
... ...
@@ -8,11 +8,23 @@
8 8
         <source>Configure member settings</source>
9 9
       </trans-unit>
10 10
       <trans-unit id="FMD.avatar.0">
11
-        <source>Profile picture</source>
11
+        <source>Profile picture / Avatar</source>
12 12
       </trans-unit>
13 13
       <trans-unit id="FMD.avatar.1">
14 14
         <source>Displays the profile picture of the member.</source>
15 15
       </trans-unit>
16
+      <trans-unit id="FMD.memberList.0">
17
+        <source>Memberlist</source>
18
+      </trans-unit>
19
+      <trans-unit id="FMD.memberList.1">
20
+        <source>Displays a list of members.</source>
21
+      </trans-unit>
22
+      <trans-unit id="FMD.memberReader.0">
23
+        <source>Memberreader</source>
24
+      </trans-unit>
25
+      <trans-unit id="FMD.memberReader.1">
26
+        <source>Displays a members details.</source>
27
+      </trans-unit>
16 28
     </body>
17 29
   </file>
18 30
 </xliff>
19 31
new file mode 100644
... ...
@@ -0,0 +1,24 @@
1
+<?xml version="1.0" ?><xliff version="1.1">
2
+  <file datatype="php" original="src/Resources/contao/languages/en/tl_module.php" source-language="en">
3
+    <body>
4
+      <trans-unit id="tl_module.memberFields.0">
5
+        <source>Member fields</source>
6
+      </trans-unit>
7
+      <trans-unit id="tl_module.memberFields.1">
8
+        <source>Here you can make a selection of the fields that will be output.</source>
9
+      </trans-unit>
10
+      <trans-unit id="tl_module.memberListTpl.0">
11
+        <source>List-Template</source>
12
+      </trans-unit>
13
+      <trans-unit id="tl_module.memberListTpl.1">
14
+        <source>Here you can choose your own member list template.</source>
15
+      </trans-unit>
16
+      <trans-unit id="tl_module.memberReaderTpl.0">
17
+        <source>Reader-Template</source>
18
+      </trans-unit>
19
+      <trans-unit id="tl_module.memberReaderTpl.1">
20
+        <source>Here you can choose your own member reader template.</source>
21
+      </trans-unit>
22
+    </body>
23
+  </file>
24
+</xliff>
0 25
new file mode 100644
... ...
@@ -0,0 +1,144 @@
1
+<?php
2
+/*
3
+ * This file is part of Oveleon ContaoMemberExtension Bundle.
4
+ *
5
+ * (c) https://www.oveleon.de/
6
+ */
7
+
8
+namespace Oveleon\ContaoMemberExtensionBundle;
9
+
10
+use Contao\Config;
11
+use Contao\Environment;
12
+use Contao\FilesModel;
13
+use Contao\MemberModel;
14
+use Contao\Module;
15
+use Contao\PageModel;
16
+use Contao\StringUtil;
17
+use Contao\System;
18
+
19
+/**
20
+ * Parent class for member modules.
21
+ *
22
+ * @author Daniele Sciannimanica <https://github.com/doishub>
23
+ */
24
+abstract class ModuleMemberExtension extends Module
25
+{
26
+    /**
27
+     * Parse member template
28
+     *
29
+     * @param $objMember
30
+     * @param $objTemplate
31
+     * @param $arrMemberFields
32
+     * @param $varImageSize
33
+     *
34
+     * @return string
35
+     */
36
+    protected function parseMemberTemplate($objMember, $objTemplate, $arrMemberFields, $varImgSize)
37
+    {
38
+        $arrFields = [];
39
+
40
+        foreach ($arrMemberFields as $field)
41
+        {
42
+            switch($field)
43
+            {
44
+                case 'avatar':
45
+                    $this->addAvatarToTemplate($objMember, $objTemplate, $varImgSize);
46
+                    break;
47
+
48
+                default:
49
+                    if($varValue = $objMember->{$field})
50
+                    {
51
+                        if (\is_array(($arrValue = StringUtil::deserialize($varValue))))
52
+                        {
53
+                            $arrFields[] = implode(",", $arrValue);
54
+                        }
55
+                        else
56
+                        {
57
+                            $arrFields[] = $varValue;
58
+                        }
59
+                    }
60
+            }
61
+        }
62
+
63
+        $objTemplate->fields = $arrFields;
64
+
65
+        if($this->jumpTo)
66
+        {
67
+            $objTemplate->link = $this->generateMemberUrl($objMember);
68
+        }
69
+
70
+        return $objTemplate->parse();
71
+    }
72
+
73
+    /**
74
+     * Add avatar to template
75
+     *
76
+     * @param $objMember
77
+     * @param $objTemplate
78
+     * @param $varImageSize
79
+     */
80
+    protected function addAvatarToTemplate($objMember, $objTemplate, $varImgSize)
81
+    {
82
+        $objTemplate->addImage = false;
83
+
84
+        $arrData = array(
85
+            'size' => $varImgSize
86
+        );
87
+
88
+        if ($objMember->avatar == '' && Config::get('defaultAvatar') == '')
89
+        {
90
+            return;
91
+        }
92
+
93
+        if ($objMember->avatar == '')
94
+        {
95
+            $objFile = FilesModel::findByUuid( Config::get('defaultAvatar') );
96
+
97
+            if ($objFile === null || !is_file(TL_ROOT . '/' . $objFile->path))
98
+            {
99
+                return;
100
+            }
101
+
102
+            $arrData['singleSRC'] = $objFile->path;
103
+            $objTemplate->addImage = true;
104
+            $this->addImageToTemplate($objTemplate, $arrData);
105
+        }
106
+
107
+        $objFile = FilesModel::findByUuid($objMember->avatar);
108
+
109
+        if ($objFile === null || !is_file(TL_ROOT . '/' . $objFile->path))
110
+        {
111
+            $arrData['singleSRC'] = FilesModel::findByUuid(Config::get('defaultAvatar'))->path;
112
+            $objTemplate->addImage = true;
113
+            $this->addImageToTemplate($objTemplate, $arrData);
114
+        }
115
+
116
+        $arrData['singleSRC'] = $objFile->path;
117
+        $objTemplate->addImage = true;
118
+        $this->addImageToTemplate($objTemplate, $arrData, null, null, $objFile);
119
+    }
120
+
121
+    /**
122
+     * Generate a URL and return it as string
123
+     *
124
+     * @param MemberModel $objMember
125
+     *
126
+     * @return string
127
+     */
128
+    protected function generateMemberUrl($objMember)
129
+    {
130
+        $objPage = PageModel::findPublishedById($this->jumpTo);
131
+
132
+        if (!$objPage instanceof PageModel)
133
+        {
134
+            $strLink = ampersand(Environment::get('request'));
135
+        }
136
+        else
137
+        {
138
+            $params = (Config::get('useAutoItem') ? '/' : '/items/') . ($objMember->alias ?: $objMember->id);
139
+            $strLink = ampersand($objPage->getFrontendUrl($params));
140
+        }
141
+
142
+        return $strLink;
143
+    }
144
+}
0 145
new file mode 100644
... ...
@@ -0,0 +1,91 @@
1
+<?php
2
+
3
+/*
4
+ * This file is part of Oveleon ContaoMemberExtension Bundle.
5
+ *
6
+ * (c) https://www.oveleon.de/
7
+ */
8
+
9
+namespace Oveleon\ContaoMemberExtensionBundle;
10
+
11
+use Contao\BackendTemplate;
12
+use Contao\FrontendTemplate;
13
+use Contao\MemberModel;
14
+use Contao\StringUtil;
15
+use Patchwork\Utf8;
16
+
17
+/**
18
+ * Class ModuleMemberList
19
+ *
20
+ * @author Daniele Sciannimanica <https://github.com/doishub>
21
+ */
22
+class ModuleMemberList extends ModuleMemberExtension
23
+{
24
+
25
+	/**
26
+	 * Template
27
+	 * @var string
28
+	 */
29
+	protected $strTemplate = 'mod_memberList';
30
+
31
+	/**
32
+	 * Template
33
+	 * @var string
34
+	 */
35
+	protected $strMemberTemplate = 'member_list_default';
36
+
37
+	/**
38
+	 * Return a wildcard in the back end
39
+	 *
40
+	 * @return string
41
+	 */
42
+	public function generate()
43
+	{
44
+		if (TL_MODE == 'BE')
45
+		{
46
+			/** @var BackendTemplate|object $objTemplate */
47
+			$objTemplate = new BackendTemplate('be_wildcard');
48
+
49
+			$objTemplate->wildcard = '### ' . Utf8::strtoupper($GLOBALS['TL_LANG']['FMD']['memberList'][0]) . ' ###';
50
+			$objTemplate->title = $this->headline;
51
+			$objTemplate->id = $this->id;
52
+			$objTemplate->link = $this->name;
53
+			$objTemplate->href = 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id;
54
+
55
+			return $objTemplate->parse();
56
+		}
57
+
58
+		return parent::generate();
59
+	}
60
+
61
+	/**
62
+	 * Generate the module
63
+	 */
64
+	protected function compile()
65
+	{
66
+        $objGroups = MemberModel::findByGroups($this->groups);
67
+        $arrMembers = null;
68
+
69
+        while($objGroups->next())
70
+        {
71
+            if($objGroups->disable)
72
+            {
73
+                continue;
74
+            }
75
+
76
+            $arrMemberFields = StringUtil::deserialize($this->memberFields, true);
77
+
78
+            $objTemplate = new FrontendTemplate($this->memberListTpl ?: $this->strMemberTemplate);
79
+            $objTemplate->setData($objGroups->current()->row());
80
+
81
+            $arrMembers[] = $this->parseMemberTemplate($objGroups->current(), $objTemplate, $arrMemberFields, $this->imgSize);
82
+        }
83
+
84
+        if(null === $arrMembers)
85
+        {
86
+            $this->Template->empty = $GLOBALS['TL_LANG']['MSC']['emptyMemberList'];
87
+        }
88
+
89
+        $this->Template->members = $arrMembers;
90
+	}
91
+}
0 92
new file mode 100644
... ...
@@ -0,0 +1,104 @@
1
+<?php
2
+
3
+/*
4
+ * This file is part of Oveleon ContaoMemberExtension Bundle.
5
+ *
6
+ * (c) https://www.oveleon.de/
7
+ */
8
+
9
+namespace Oveleon\ContaoMemberExtensionBundle;
10
+
11
+use Contao\BackendTemplate;
12
+use Contao\Config;
13
+use Contao\CoreBundle\Exception\PageNotFoundException;
14
+use Contao\Environment;
15
+use Contao\FrontendTemplate;
16
+use Contao\Input;
17
+use Contao\MemberModel;
18
+use Contao\StringUtil;
19
+use Patchwork\Utf8;
20
+
21
+/**
22
+ * Class ModuleMemberList
23
+ *
24
+ * @author Daniele Sciannimanica <https://github.com/doishub>
25
+ */
26
+class ModuleMemberReader extends ModuleMemberExtension
27
+{
28
+
29
+	/**
30
+	 * Template
31
+	 * @var string
32
+	 */
33
+	protected $strTemplate = 'mod_memberReader';
34
+
35
+	/**
36
+	 * Template
37
+	 * @var string
38
+	 */
39
+	protected $strMemberTemplate = 'member_reader_full';
40
+
41
+	/**
42
+	 * Return a wildcard in the back end
43
+	 *
44
+	 * @return string
45
+	 */
46
+	public function generate()
47
+	{
48
+		if (TL_MODE == 'BE')
49
+		{
50
+			/** @var BackendTemplate|object $objTemplate */
51
+			$objTemplate = new BackendTemplate('be_wildcard');
52
+
53
+			$objTemplate->wildcard = '### ' . Utf8::strtoupper($GLOBALS['TL_LANG']['FMD']['memberList'][0]) . ' ###';
54
+			$objTemplate->title = $this->headline;
55
+			$objTemplate->id = $this->id;
56
+			$objTemplate->link = $this->name;
57
+			$objTemplate->href = 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id;
58
+
59
+			return $objTemplate->parse();
60
+		}
61
+
62
+        // Set the item from the auto_item parameter
63
+        if (!isset($_GET['items']) && isset($_GET['auto_item']) && Config::get('useAutoItem'))
64
+        {
65
+            Input::setGet('items', Input::get('auto_item'));
66
+        }
67
+
68
+		return parent::generate();
69
+	}
70
+
71
+	/**
72
+	 * Generate the module
73
+	 */
74
+	protected function compile()
75
+	{
76
+        $this->Template->referer = 'javascript:history.go(-1)';
77
+        $this->Template->back = $GLOBALS['TL_LANG']['MSC']['goBack'];
78
+
79
+        // Get the member
80
+        $objMember = MemberModel::findByIdOrAlias(Input::get('items'));
81
+
82
+        // The member does not exist
83
+        if ($objMember === null || $objMember->disable)
84
+        {
85
+            throw new PageNotFoundException('Page not found: ' . Environment::get('uri'));
86
+        }
87
+
88
+        // Check groups
89
+        $arrGroups = StringUtil::deserialize($this->groups);
90
+        $memberGroups = StringUtil::deserialize($objMember->groups);
91
+
92
+        if (empty($arrGroups) || !\is_array($arrGroups) || !\count(array_intersect($arrGroups, $memberGroups)))
93
+        {
94
+            throw new PageNotFoundException('Page not found: ' . Environment::get('uri'));
95
+        }
96
+
97
+        $arrMemberFields = StringUtil::deserialize($this->memberFields, true);
98
+
99
+        $objTemplate = new FrontendTemplate($this->memberReaderTpl ?: $this->strMemberTemplate);
100
+        $objTemplate->setData($objMember->row());
101
+
102
+        $this->Template->member = $this->parseMemberTemplate($objMember, $objTemplate, $arrMemberFields, $this->imgSize);
103
+	}
104
+}
0 105
new file mode 100644
... ...
@@ -0,0 +1,15 @@
1
+<div class="member_list_default">
2
+    <?php if($this->addImage): ?>
3
+        <figure class="image_container">
4
+          <?php $this->insert('picture_default', $this->picture); ?>
5
+        </figure>
6
+    <?php endif; ?>
7
+    <ul>
8
+        <?php foreach ($this->fields as $field): ?>
9
+            <li><?=$field?></li>
10
+        <?php endforeach; ?>
11
+    </ul>
12
+    <?php if($this->link): ?>
13
+        <a href="<?=$this->link?>"><?=$GLOBALS['TL_LANG']['MSC']['memberDetail']?></a>
14
+    <?php endif; ?>
15
+</div>
0 16
new file mode 100644
... ...
@@ -0,0 +1,12 @@
1
+<div class="member_reader_full">
2
+    <?php if($this->addImage): ?>
3
+        <figure class="image_container">
4
+          <?php $this->insert('picture_default', $this->picture); ?>
5
+        </figure>
6
+    <?php endif; ?>
7
+    <ul>
8
+        <?php foreach ($this->fields as $field): ?>
9
+            <li><?=$field?></li>
10
+        <?php endforeach; ?>
11
+    </ul>
12
+</div>
0 13
new file mode 100644
... ...
@@ -0,0 +1,13 @@
1
+<?php $this->extend('block_unsearchable'); ?>
2
+
3
+<?php $this->block('content'); ?>
4
+
5
+<?php if ($this->members): ?>
6
+    <?php foreach ($this->members as $member): ?>
7
+        <?=$member?>
8
+    <?php endforeach; ?>
9
+<?php else: ?>
10
+    <p class="empty message"><?=$this->empty?></p>
11
+<?php endif; ?>
12
+
13
+<?php $this->endblock(); ?>
0 14
new file mode 100644
... ...
@@ -0,0 +1,7 @@
1
+<?php $this->extend('block_unsearchable'); ?>
2
+
3
+<?php $this->block('content'); ?>
4
+
5
+<?=$this->member?>
6
+
7
+<?php $this->endblock(); ?>