Browse code

[Addition] Add member avatar insert tags

Sebastian Zoglowek authored on24/05/2022 13:38:16
Showing6 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,29 @@
1
+<?php
2
+
3
+/**
4
+ * Procuna
5
+ *
6
+ * @link      https://www.oveleon.de/
7
+ * @copyright Copyright (c) 2021  Oveleon GbR (https://www.oveleon.de)
8
+ */
9
+
10
+
11
+namespace Oveleon\ContaoMemberExtensionBundle\DependencyInjection;
12
+
13
+use Symfony\Component\Config\FileLocator;
14
+use Symfony\Component\DependencyInjection\ContainerBuilder;
15
+use Symfony\Component\DependencyInjection\Extension\Extension;
16
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
17
+
18
+class ContaoMemberExtensionExtension extends Extension
19
+{
20
+    public function load(array $configs, ContainerBuilder $container): void
21
+    {
22
+        $loader = new YamlFileLoader(
23
+            $container,
24
+            new FileLocator(__DIR__.'/../Resources/config')
25
+        );
26
+
27
+        $loader->load('listener.yml');
28
+    }
29
+}
0 30
new file mode 100644
... ...
@@ -0,0 +1,123 @@
1
+<?php
2
+
3
+declare(strict_types=1);
4
+
5
+/*
6
+ * This file is part of Oveleon ContaoMemberExtension Bundle.
7
+ *
8
+ * @package     contao-member-extension-bundle
9
+ * @license     MIT
10
+ * @author      Daniele Sciannimanica   <https://github.com/doishub>
11
+ * @author      Fabian Ekert            <https://github.com/eki89>
12
+ * @author      Sebastian Zoglowek      <https://github.com/zoglo>
13
+ * @copyright   Oveleon                 <https://www.oveleon.de/>
14
+ */
15
+
16
+namespace Oveleon\ContaoMemberExtensionBundle\EventListener;
17
+
18
+use Contao\FrontendTemplate;
19
+use Contao\FrontendUser;
20
+use Contao\Image\ResizeConfiguration;
21
+use Contao\MemberModel;
22
+use Contao\System;
23
+use Contao\CoreBundle\Framework\ContaoFramework;
24
+use Oveleon\ContaoMemberExtensionBundle\Member;
25
+
26
+class InsertTagsListener
27
+{
28
+    private const SUPPORTED_TAGS = [
29
+        'avatar'
30
+    ];
31
+
32
+    /**
33
+     * @var ContaoFramework
34
+     */
35
+    private $framework;
36
+
37
+    public function __construct(ContaoFramework $framework)
38
+    {
39
+        $this->framework = $framework;
40
+    }
41
+
42
+    /**
43
+     * @return string|false
44
+     */
45
+    public function __invoke(string $tag, bool $useCache, $cacheValue, array $flags)
46
+    {
47
+        $elements = explode('::', $tag);
48
+        $key = strtolower($elements[0]);
49
+
50
+        if (\in_array($key, self::SUPPORTED_TAGS, true)) {
51
+            return $this->replaceEventInsertTag($key, $elements, $flags);
52
+        }
53
+
54
+        return false;
55
+    }
56
+
57
+    private function replaceEventInsertTag(string $insertTag, array $elements, array $flags): string
58
+    {
59
+        $this->framework->initialize();
60
+        $tokenChecker = System::getContainer()->get('contao.security.token_checker');
61
+
62
+        if($elements[1] !== 'member')
63
+        {
64
+            return '';
65
+        }
66
+
67
+        switch ($elements[2]) {
68
+
69
+            case 'current':
70
+                if(!$tokenChecker->hasFrontendUser())
71
+                {
72
+                    return '';
73
+                }
74
+                $memberID = FrontendUser::getInstance()->id;
75
+                break;
76
+
77
+            default:
78
+                if(!\is_numeric($elements[2]))
79
+                {
80
+                    return '';
81
+                }
82
+                $memberID = $elements[2];
83
+                break;
84
+        }
85
+
86
+        if(!!$objMember = MemberModel::findByPk($memberID))
87
+        {
88
+            $strImgSize = $this->convertImgSize($elements[3]);
89
+            $objTemplate = new FrontendTemplate('memberExtension_image');
90
+
91
+            Member::parseMemberAvatar($objMember, $objTemplate, $strImgSize);
92
+
93
+            return $objTemplate->parse();
94
+        }
95
+
96
+        return '';
97
+    }
98
+
99
+    private function convertImgSize($strSize): ?string
100
+    {
101
+        if (!$strSize)
102
+        {
103
+            return null;
104
+        }
105
+
106
+        list($intWidth, $intHeight, $mode) = explode('x', $strSize);
107
+
108
+        $arrSizes = [$intWidth, $intHeight];
109
+
110
+        $arrValidModes = [
111
+            ResizeConfiguration::MODE_BOX,
112
+            ResizeConfiguration::MODE_PROPORTIONAL,
113
+            ResizeConfiguration::MODE_CROP,
114
+        ];
115
+
116
+        if(!!$mode && in_array($mode, $arrValidModes, true))
117
+        {
118
+            $arrSizes[] = $mode;
119
+        }
120
+
121
+        return serialize($arrSizes);
122
+    }
123
+}
0 124
new file mode 100644
... ...
@@ -0,0 +1,8 @@
1
+services:
2
+    contao_member.listener.insert_tags:
3
+        class: Oveleon\ContaoMemberExtensionBundle\EventListener\InsertTagsListener
4
+        arguments:
5
+            - '@contao.framework'
6
+        tags:
7
+          - { name: contao.hook, hook: replaceInsertTags }
8
+        public: true
... ...
@@ -37,6 +37,8 @@ use Psr\Log\LogLevel;
37 37
  */
38 38
 class Member extends Frontend
39 39
 {
40
+    const DEFAULT_PICTURE = 'bundles/contaomemberextension/avatar.png';
41
+
40 42
     /**
41 43
      * MemberAvatar file name
42 44
      *
... ...
@@ -266,6 +268,49 @@ class Member extends Frontend
266 268
     }
267 269
 
268 270
     /**
271
+     * Parses an avatar to the template
272
+     *
273
+     * @param MemberModel $objMember
274
+     * @param $objTemplate
275
+     * @param $strImgSize
276
+     * @return void
277
+     */
278
+    public static function parseMemberAvatar(MemberModel $objMember, &$objTemplate, $strImgSize)
279
+    {
280
+        $objTemplate->singleSRC = self::DEFAULT_PICTURE;
281
+        $objTemplate->addImage = false;
282
+
283
+        $uuidDefault = Config::get('defaultAvatar');
284
+
285
+        if(!!$objMember->avatar)
286
+        {
287
+            $objFile = FilesModel::findByUuid($objMember->avatar);
288
+        }
289
+        else if(!!$uuidDefault)
290
+        {
291
+            $objFile = FilesModel::findByUuid($uuidDefault);
292
+        }
293
+        else
294
+        {
295
+            return;
296
+        }
297
+
298
+        $projectDir = System::getContainer()->getParameter('kernel.project_dir');
299
+
300
+        // If file does not exist use default image
301
+        if (null === $objFile || !\is_file($projectDir . '/' . $objFile->path))
302
+        {
303
+            return;
304
+        }
305
+
306
+        $objTemplate->addImage = true;
307
+        $arrData = ['singleSRC'=>$objFile->path, 'size'=>$strImgSize];
308
+
309
+        //ToDo: Change to FigureBuilder in the future
310
+        $objTemplate->addImageToTemplate($objTemplate, $arrData);
311
+    }
312
+
313
+    /**
269 314
      * @param MemberModel $objMember
270 315
      *
271 316
      * @return void
... ...
@@ -83,6 +83,6 @@ class ModuleAvatar extends ModuleMemberExtension
83 83
         $this->import(FrontendUser::class, 'User');
84 84
         $objMember = MemberModel::findByPk($this->User->id);
85 85
 
86
-        $this->parseMemberAvatar($objMember, $objTemplate, $this->imgSize);
86
+        Member::parseMemberAvatar($objMember, $objTemplate, $this->imgSize);
87 87
     }
88 88
 }
... ...
@@ -31,8 +31,6 @@ use Contao\System;
31 31
  */
32 32
 abstract class ModuleMemberExtension extends Module
33 33
 {
34
-    const DEFAULT_PICTURE = 'bundles/contaomemberextension/avatar.png';
35
-
36 34
     /**
37 35
      * Parse member template
38 36
      *
... ...
@@ -51,7 +49,7 @@ abstract class ModuleMemberExtension extends Module
51 49
             switch($field)
52 50
             {
53 51
                 case 'avatar':
54
-                    $this->parseMemberAvatar($objMember, $objTemplate, $strImgSize);
52
+                    Member::parseMemberAvatar($objMember, $objTemplate, $strImgSize);
55 53
                     break;
56 54
 
57 55
                 default:
... ...
@@ -80,49 +78,6 @@ abstract class ModuleMemberExtension extends Module
80 78
     }
81 79
 
82 80
     /**
83
-     * Parses an avatar to the template
84
-     *
85
-     * @param MemberModel $objMember
86
-     * @param $objTemplate
87
-     * @param $strImgSize
88
-     * @return void
89
-     */
90
-    protected function parseMemberAvatar(MemberModel $objMember, $objTemplate, $strImgSize)
91
-    {
92
-        $objTemplate->singleSRC = self::DEFAULT_PICTURE;
93
-        $objTemplate->addImage = false;
94
-
95
-        $uuidDefault = Config::get('defaultAvatar');
96
-
97
-        if(!!$objMember->avatar)
98
-        {
99
-            $objFile = FilesModel::findByUuid($objMember->avatar);
100
-        }
101
-        else if(!!$uuidDefault)
102
-        {
103
-            $objFile = FilesModel::findByUuid($uuidDefault);
104
-        }
105
-        else
106
-        {
107
-            return;
108
-        }
109
-
110
-        $projectDir = System::getContainer()->getParameter('kernel.project_dir');
111
-
112
-        // If file does not exist use default image
113
-        if (null === $objFile || !\is_file($projectDir . '/' . $objFile->path))
114
-        {
115
-            return;
116
-        }
117
-
118
-        $objTemplate->addImage = true;
119
-        $this->size = $strImgSize;
120
-        $this->singleSRC = $objFile->path;
121
-        //ToDo: Change to FigureBuilder in the future
122
-        $this->addImageToTemplate($objTemplate, $this->arrData);
123
-    }
124
-
125
-    /**
126 81
      * Generate a URL and return it as string
127 82
      *
128 83
      * @param MemberModel $objMember