Browse code

Add insert tag {{avatar_url::member::*}} and parseAvatar changes

Sebastian Zoglowek authored on10/08/2022 11:56:24 • GitHub committed on10/08/2022 11:56:24
Showing4 changed files
... ...
@@ -113,6 +113,10 @@ Member avatars can be shown using following *insert-tags*
113 113
 {{avatar::member::current::200x200xproportional}}
114 114
 {{avatar::member::4}}
115 115
 {{avatar::member::4::300x300xcrop}}
116
+
117
+// Output file url
118
+{{avatar_url::member::current}}
119
+{{avatar_url::member:4}}
116 120
 ```
117 121
 
118 122
 The allowed image size parameters are:
... ...
@@ -26,7 +26,8 @@ use Oveleon\ContaoMemberExtensionBundle\Member;
26 26
 class InsertTagsListener
27 27
 {
28 28
     private const SUPPORTED_TAGS = [
29
-        'avatar'
29
+        'avatar',
30
+        'avatar_url'
30 31
     ];
31 32
 
32 33
     /**
... ...
@@ -48,13 +49,13 @@ class InsertTagsListener
48 49
         $key = strtolower($elements[0]);
49 50
 
50 51
         if (\in_array($key, self::SUPPORTED_TAGS, true)) {
51
-            return $this->replaceEventInsertTag($key, $elements, $flags);
52
+            return $this->replaceMemberInsertTag($key, $elements, $flags);
52 53
         }
53 54
 
54 55
         return false;
55 56
     }
56 57
 
57
-    private function replaceEventInsertTag(string $insertTag, array $elements, array $flags): string
58
+    private function replaceMemberInsertTag(string $insertTag, array $elements, array $flags): string
58 59
     {
59 60
         $this->framework->initialize();
60 61
         $tokenChecker = System::getContainer()->get('contao.security.token_checker');
... ...
@@ -83,14 +84,24 @@ class InsertTagsListener
83 84
                 break;
84 85
         }
85 86
 
86
-        if(!!$objMember = MemberModel::findByPk($memberID))
87
+        $objMember = MemberModel::findByPk($memberID);
88
+
89
+        switch ($insertTag)
87 90
         {
88
-            $strImgSize = $this->convertImgSize($elements[3]);
89
-            $objTemplate = new FrontendTemplate('memberExtension_image');
91
+            case 'avatar':
92
+            {
93
+                $strImgSize = $this->convertImgSize($elements[3]);
94
+                $objTemplate = new FrontendTemplate('memberExtension_image');
95
+
96
+                Member::parseMemberAvatar($objMember, $objTemplate, $strImgSize);
90 97
 
91
-            Member::parseMemberAvatar($objMember, $objTemplate, $strImgSize);
98
+                return $objTemplate->parse();
99
+            }
92 100
 
93
-            return $objTemplate->parse();
101
+            case 'avatar_url':
102
+            {
103
+                return Member::getMemberAvatarURL($objMember);
104
+            }
94 105
         }
95 106
 
96 107
         return '';
... ...
@@ -32,7 +32,7 @@ use Psr\Log\LogLevel;
32 32
 
33 33
 /**
34 34
  * Class Member
35
- * 
35
+ *
36 36
  * @property int $avatar UUID of the avatar
37 37
  */
38 38
 class Member extends Frontend
... ...
@@ -270,36 +270,27 @@ class Member extends Frontend
270 270
     /**
271 271
      * Parses an avatar to the template
272 272
      *
273
-     * @param MemberModel $objMember
273
+     * @param MemberModel|null $objMember
274 274
      * @param $objTemplate
275 275
      * @param $strImgSize
276 276
      * @return void
277 277
      */
278
-    public static function parseMemberAvatar(MemberModel $objMember, &$objTemplate, $strImgSize)
278
+    public static function parseMemberAvatar(?MemberModel $objMember, &$objTemplate, $strImgSize)
279 279
     {
280 280
         $objTemplate->addImage= true;
281 281
 
282 282
         $objTemplate->singleSRC = self::DEFAULT_PICTURE;
283 283
         $objTemplate->addFallbackImage = true;
284 284
 
285
-        $uuidDefault = Config::get('defaultAvatar');
285
+        $projectDir = System::getContainer()->getParameter('kernel.project_dir');
286 286
 
287
-        if(!!$objMember->avatar)
288
-        {
289
-            $objFile = FilesModel::findByUuid($objMember->avatar);
290
-        }
291
-        else if(!!$uuidDefault)
292
-        {
293
-            $objFile = FilesModel::findByUuid($uuidDefault);
294
-        }
295
-        else
287
+        // Check if member avatar exists
288
+        if(null === $objMember || null === $objMember->avatar || null === ($objFile = FilesModel::findByUuid($objMember->avatar)) || !\is_file($projectDir.'/'.$objFile->path))
296 289
         {
297
-            return;
290
+            $objFile = !!($uuidDefault = Config::get('defaultAvatar')) ? FilesModel::findByUuid($uuidDefault) : null;
298 291
         }
299 292
 
300
-        $projectDir = System::getContainer()->getParameter('kernel.project_dir');
301
-
302
-        // If file does not exist use default image
293
+        // Check if config avatar exists
303 294
         if (null === $objFile || !\is_file($projectDir . '/' . $objFile->path))
304 295
         {
305 296
             return;
... ...
@@ -313,6 +304,31 @@ class Member extends Frontend
313 304
     }
314 305
 
315 306
     /**
307
+     * Gets the url for a member avatar
308
+     *
309
+     * @param MemberModel|null $objMember
310
+     * @return string
311
+     */
312
+    public static function getMemberAvatarURL(?MemberModel $objMember): string
313
+    {
314
+        // ToDo: Merge logic with parseMemberAvatar
315
+        $projectDir = System::getContainer()->getParameter('kernel.project_dir');
316
+
317
+        if(null === $objMember || null === $objMember->avatar || null === ($objFile = FilesModel::findByUuid($objMember->avatar)) || !\is_file($projectDir.'/'. $objFile->path))
318
+        {
319
+            $objFile = !!($uuidDefault = Config::get('defaultAvatar')) ? FilesModel::findByUuid($uuidDefault) : null;
320
+        }
321
+
322
+        // Check if config avatar exists
323
+        if (null === $objFile || !\is_file($projectDir . '/' . $objFile->path))
324
+        {
325
+            return self::DEFAULT_PICTURE;
326
+        }
327
+
328
+        return $objFile->path;
329
+    }
330
+
331
+    /**
316 332
      * @param MemberModel $objMember
317 333
      *
318 334
      * @return void
... ...
@@ -16,8 +16,9 @@ declare(strict_types=1);
16 16
 namespace Oveleon\ContaoMemberExtensionBundle;
17 17
 
18 18
 use Contao\Config;
19
+use Contao\Date;
19 20
 use Contao\Environment;
20
-use Contao\FilesModel;
21
+use Contao\MemberGroupModel;
21 22
 use Contao\MemberModel;
22 23
 use Contao\Module;
23 24
 use Contao\PageModel;
... ...
@@ -40,14 +41,23 @@ abstract class ModuleMemberExtension extends Module
40 41
      * @param $strImgSize
41 42
      * @return string
42 43
      */
43
-    protected function parseMemberTemplate($objMember, $objTemplate, $arrMemberFields, $strImgSize)
44
+    protected function parseMemberTemplate($objMember, $objTemplate, $arrMemberFields, $strImgSize): string
44 45
     {
46
+        System::loadLanguageFile('default');
47
+        System::loadLanguageFile('tl_member');
48
+        System::loadLanguageFile('countries');
49
+        System::loadLanguageFile('languages');
50
+
45 51
         $arrFields = [];
46 52
 
47 53
         foreach ($arrMemberFields as $field)
48 54
         {
49 55
             switch($field)
50 56
             {
57
+                /*case 'homeDir':
58
+                case 'assignDir':
59
+                    break;*/
60
+
51 61
                 case 'avatar':
52 62
                     Member::parseMemberAvatar($objMember, $objTemplate, $strImgSize);
53 63
                     break;
... ...
@@ -55,14 +65,7 @@ abstract class ModuleMemberExtension extends Module
55 65
                 default:
56 66
                     if($varValue = $objMember->{$field})
57 67
                     {
58
-                        if (\is_array(($arrValue = StringUtil::deserialize($varValue))))
59
-                        {
60
-                            $arrFields[$field] = implode(",", $arrValue);
61
-                        }
62
-                        else
63
-                        {
64
-                            $arrFields[$field] = $varValue;
65
-                        }
68
+                        self::parseMemberDetails($arrFields, $field, $varValue);
66 69
                     }
67 70
             }
68 71
         }
... ...
@@ -84,7 +87,7 @@ abstract class ModuleMemberExtension extends Module
84 87
      *
85 88
      * @return string
86 89
      */
87
-    protected function generateMemberUrl($objMember)
90
+    protected function generateMemberUrl(MemberModel $objMember): string
88 91
     {
89 92
         $objPage = PageModel::findPublishedById($this->jumpTo);
90 93
 
... ...
@@ -100,4 +103,68 @@ abstract class ModuleMemberExtension extends Module
100 103
 
101 104
         return $strLink;
102 105
     }
106
+
107
+    protected function parseMemberDetails(&$arrFields, $field, $value)
108
+    {
109
+        $strReturn = sprintf('<span class="label">%s: </span>',$GLOBALS['TL_LANG']['tl_member'][$field][0] ?? null);
110
+
111
+        if (!\is_array(($arrValue = StringUtil::deserialize($value))))
112
+        {
113
+            switch ($field) {
114
+                case 'gender':
115
+                    $strReturn .= $GLOBALS['TL_LANG']['MSC'][$value] ?? $value;
116
+                    break;
117
+
118
+                case 'email':
119
+                    $strEmail = StringUtil::encodeEmail($value);
120
+                    $strReturn .= '<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;' . $strEmail . '" title="' . $strEmail . '">' . preg_replace('/\?.*$/', '', $strEmail) . '</a>';
121
+                    break;
122
+
123
+                case 'phone':
124
+                case 'mobile':
125
+                case 'fax':
126
+                    $strTel = preg_replace('/[^a-z\d+]/i', '', (string)$value);
127
+                    $strReturn .= '<a href="tel:' . $strTel . '" title="' . $value . '">' . $value . '</a>';
128
+                    break;
129
+
130
+                case 'website':
131
+                    $strUrl = $value;
132
+
133
+                    if (strncmp($value, 'http://', 7) !== 0 || strncmp($value, 'https://', 8) !== 0) {
134
+                        $strUrl = 'https://' . $value;
135
+                    }
136
+
137
+                    $strReturn .= '<a href="' . $strUrl . '" title="' . $value . '" target="blank noopener" rel="noreferer">' . $value . '</a>';
138
+                    break;
139
+
140
+                case 'dateOfBirth':
141
+                    $strReturn .= Date::parse(Config::get('dateFormat'), $value) ?? $value;
142
+                    break;
143
+
144
+                case 'country':
145
+                    $strReturn .= $GLOBALS['TL_LANG']['CNT'][$value] ?? $value;
146
+                    break;
147
+
148
+                case 'language':
149
+                    $strReturn .= $GLOBALS['TL_LANG']['LNG'][$value] ?? $value;
150
+                    break;
151
+
152
+                default:
153
+                    $strReturn .= $value;
154
+            }
155
+        }
156
+        else if ('groups' === $field)
157
+        {
158
+            $arrReturn = [];
159
+
160
+            foreach ($arrValue as $value)
161
+            {
162
+                $arrReturn[] = MemberGroupModel::findById($value)->name;
163
+            }
164
+
165
+            $strReturn .= implode(", ", $arrReturn);
166
+        }
167
+
168
+        $arrFields[$field] = $strReturn;
169
+    }
103 170
 }