Browse code

Version 1.5 initial commit

Benjamin Roth authored on24/06/2024 12:06:17
Showing1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,203 @@
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      Sebastian Zoglowek     <https://github.com/zoglo>
11
+ * @author      Daniele Sciannimanica  <https://github.com/doishub>
12
+ * @author      Fabian Ekert           <https://github.com/eki89>
13
+ * @copyright   Oveleon                <https://www.oveleon.de/>
14
+ */
15
+
16
+namespace Oveleon\ContaoMemberExtensionBundle\Controller\FrontendModule;
17
+
18
+use Contao\Config;
19
+use Contao\Controller;
20
+use Contao\CoreBundle\ContaoCoreBundle;
21
+use Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
22
+use Contao\CoreBundle\EventListener\Widget\HttpUrlListener;
23
+use Contao\Date;
24
+use Contao\Environment;
25
+use Contao\FrontendTemplate;
26
+use Contao\MemberGroupModel;
27
+use Contao\MemberModel;
28
+use Contao\Model;
29
+use Contao\ModuleModel;
30
+use Contao\PageModel;
31
+use Contao\StringUtil;
32
+use Contao\System;
33
+use Oveleon\ContaoMemberExtensionBundle\Member;
34
+
35
+abstract class MemberExtensionController extends AbstractFrontendModuleController
36
+{
37
+    private ModuleModel $model;
38
+
39
+    protected bool $isTable = false;
40
+
41
+    protected array $memberFields = [];
42
+
43
+    protected array $labels = [];
44
+
45
+    protected function parseMemberTemplate(MemberModel|Model $objMember, FrontendTemplate $objTemplate, ModuleModel $model): string
46
+    {
47
+        System::loadLanguageFile('default');
48
+        System::loadLanguageFile('tl_member');
49
+        System::loadLanguageFile('countries');
50
+        System::loadLanguageFile('languages');
51
+
52
+        $this->model = $model;
53
+
54
+        $arrFields = [];
55
+
56
+        // HOOK: modify the member details
57
+        if (isset($GLOBALS['TL_HOOKS']['parseMemberTemplate']) && \is_array($GLOBALS['TL_HOOKS']['parseMemberTemplate']))
58
+        {
59
+            foreach ($GLOBALS['TL_HOOKS']['parseMemberTemplate'] as $callback)
60
+            {
61
+                System::importStatic($callback[0])->{$callback[1]}($objMember, $this->memberFields, $objTemplate, $model, $this);
62
+            }
63
+        }
64
+
65
+        foreach ($this->memberFields as $field)
66
+        {
67
+            switch ($field)
68
+            {
69
+                /*case 'homeDir':
70
+                case 'assignDir':
71
+                    break;*/
72
+
73
+                case 'avatar':
74
+                    Member::parseMemberAvatar($objMember, $objTemplate, $model->imgSize);
75
+                    break;
76
+
77
+                default:
78
+                    if ($varValue = $objMember->{$field})
79
+                    {
80
+                        if (\is_array(($arrValue = StringUtil::deserialize($varValue))))
81
+                        {
82
+                            $arrFields[$field] = implode(",", $arrValue);
83
+                        }
84
+                        else
85
+                        {
86
+                            $arrFields[$field] = $varValue;
87
+                        }
88
+
89
+                        if ($model->ext_parseDetails)
90
+                        {
91
+                            self::parseMemberDetails($arrFields, $field, $varValue);
92
+                        }
93
+                    }
94
+            }
95
+        }
96
+
97
+        $returnFields = [];
98
+
99
+        foreach ($this->memberFields as $value)
100
+        {
101
+            $returnFields[$value] = $arrFields[$value] ?? '';
102
+        }
103
+
104
+        $labels = array_keys($returnFields);
105
+
106
+        $this->parsedLabels = true;
107
+        $this->labels = array_map(fn($field) => $GLOBALS['TL_LANG']['tl_member'][$field][0] ?? $field, $labels);;
108
+
109
+        $objTemplate->fields = $returnFields;
110
+
111
+        if ($model->jumpTo)
112
+        {
113
+            $objTemplate->link = $this->generateMemberUrl($objMember);
114
+        }
115
+
116
+        return $objTemplate->parse();
117
+    }
118
+
119
+    protected function generateMemberUrl(MemberModel $objMember): string
120
+    {
121
+        $objPage = PageModel::findPublishedById($this->model->jumpTo);
122
+
123
+        if (!$objPage instanceof PageModel)
124
+        {
125
+            $strLink = StringUtil::ampersand(Environment::get('request'));
126
+        }
127
+        else
128
+        {
129
+            $params = ($this->useAutoItem() ? '/' : '/items/') . ($this->model->ext_memberAlias ? ($objMember->alias ?: $objMember->id) : $objMember->id);
130
+            $strLink = StringUtil::ampersand($objPage->getFrontendUrl($params));
131
+        }
132
+
133
+        return $strLink;
134
+    }
135
+
136
+    protected function parseMemberDetails(&$arrFields, $field, $value): void
137
+    {
138
+        $strReturn = !$this->isTable ? sprintf('<span class="label">%s: </span>',$GLOBALS['TL_LANG']['tl_member'][$field][0] ?? null) : '';
139
+
140
+        if (!\is_array(($arrValue = StringUtil::deserialize($value))))
141
+        {
142
+            Controller::loadDataContainer('tl_member');
143
+
144
+            if (!empty($rgxp = $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['rgxp'] ?? []))
145
+            {
146
+                switch ($rgxp) {
147
+                    case HttpUrlListener::RGXP_NAME:
148
+                        $strReturn .= '<a href="' . $value . '" title="' . $value . '" target="blank noopener" rel="noreferer">' . preg_replace('/https?:\/\/|www.|\/$/', '', $value) . '</a>';
149
+                        break;
150
+
151
+                    case 'phone':
152
+                        $strTel = preg_replace('/[^a-z\d+]/i', '', (string)$value);
153
+                        $strReturn .= '<a href="tel:' . $strTel . '" title="' . $value . '">' . $value . '</a>';
154
+                        break;
155
+
156
+                    case 'email':
157
+                        $strEmail = StringUtil::encodeEmail($value);
158
+                        $strReturn .= '<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;' . $strEmail . '" title="' . $strEmail . '">' . preg_replace('/\?.*$/', '', $strEmail) . '</a>';
159
+                        break;
160
+
161
+                    case 'date':
162
+                        $strReturn .= Date::parse(Config::get('dateFormat'), $value) ?? $value;
163
+                        break;
164
+
165
+                    default:
166
+                        $strReturn .= $value;
167
+                }
168
+            }
169
+            else {
170
+                $strReturn .= match ($field) {
171
+                    'gender' => $GLOBALS['TL_LANG']['MSC'][$value] ?? $value,
172
+                    'country' => $GLOBALS['TL_LANG']['CNT'][$value] ?? $value,
173
+                    'language' => $GLOBALS['TL_LANG']['LNG'][$value] ?? $value,
174
+                    default => $value
175
+                };
176
+            }
177
+        }
178
+        else if ('groups' === $field)
179
+        {
180
+            $arrReturn = [];
181
+
182
+            foreach ($arrValue as $value)
183
+            {
184
+                $arrReturn[] = MemberGroupModel::findById($value)->name;
185
+            }
186
+
187
+            $strReturn .= implode(", ", $arrReturn);
188
+        }
189
+
190
+        $arrFields[$field] = $strReturn;
191
+    }
192
+
193
+    /**
194
+     * Checks weather auto_item should be used to provide BC
195
+     *
196
+     * @deprecated - To be removed when contao 4.13 support ends
197
+     * @internal
198
+     */
199
+    protected function useAutoItem(): bool
200
+    {
201
+        return version_compare(ContaoCoreBundle::getVersion(), '5', '<') ? Config::get('useAutoItem') : true;
202
+    }
203
+}