Browse code

Restore Contao 4.5+ user registration modifications

Benjamin Roth authored on17/03/2019 20:51:03
Showing2 changed files
... ...
@@ -14,4 +14,5 @@
14 14
 
15 15
 //$GLOBALS['TL_CSS']['formilicious'] = 'system/modules/eSM_formilicious/assets/css/form.min.css||static';
16 16
 $GLOBALS['TL_HOOKS']['loadDataContainer'][] = array('\FormiliciousHooks','eSMLoadDataContainer');
17
-$GLOBALS['TL_HOOKS']['loadFormField'][] = array('\FormiliciousHooks','eSMLoadFormField');
18 17
\ No newline at end of file
18
+$GLOBALS['TL_HOOKS']['loadFormField'][] = array('\FormiliciousHooks','eSMLoadFormField');
19
+$GLOBALS['FE_MOD']['user']['registration'] = '\eSM_formilicious\ModuleRegistration';
19 20
\ No newline at end of file
... ...
@@ -29,6 +29,16 @@ namespace eSM_formilicious;
29 29
  */
30 30
 class ModuleRegistration extends \Contao\ModuleRegistration
31 31
 {
32
+  public function generate()
33
+  {
34
+    $this->loadDataContainer('tl_member');
35
+    $originalDca = $GLOBALS['TL_DCA']['tl_member'];
36
+    $return = parent::generate();
37
+    $GLOBALS['TL_DCA']['tl_member'] = $originalDca;
38
+
39
+    return $return;
40
+  }
41
+
32 42
 
33 43
   /**
34 44
    * Generate the module
... ...
@@ -43,292 +53,26 @@ class ModuleRegistration extends \Contao\ModuleRegistration
43 53
     \System::loadLanguageFile('tl_member');
44 54
     $this->loadDataContainer('tl_member');
45 55
 
46
-    // Call onload_callback (e.g. to check permissions)
47
-    if (is_array($GLOBALS['TL_DCA']['tl_member']['config']['onload_callback']))
48
-    {
49
-      foreach ($GLOBALS['TL_DCA']['tl_member']['config']['onload_callback'] as $callback)
50
-      {
51
-        if (is_array($callback))
52
-        {
53
-          $this->import($callback[0]);
54
-          $this->{$callback[0]}->{$callback[1]}();
55
-        }
56
-        elseif (is_callable($callback))
57
-        {
58
-          $callback();
59
-        }
60
-      }
61
-    }
62
-
63
-    // Activate account
64
-    if (\Input::get('token') != '')
65
-    {
66
-      $this->activateAcount();
67
-
68
-      return;
69
-    }
70
-
71
-    if ($this->memberTpl != '')
72
-    {
73
-      /** @var \FrontendTemplate|object $objTemplate */
74
-      $objTemplate = new \FrontendTemplate($this->memberTpl);
75
-
76
-      $this->Template = $objTemplate;
77
-      $this->Template->setData($this->arrData);
78
-    }
79
-
80
-    $this->Template->fields = '';
81
-    $this->Template->tableless = $this->tableless;
82
-    $objCaptcha = null;
83
-    $doNotSubmit = false;
84
-
85
-    // Predefine the group order (other groups will be appended automatically)
86
-    $arrGroups = array
87
-    (
88
-      'personal' => array(),
89
-      'address'  => array(),
90
-      'contact'  => array(),
91
-      'login'    => array(),
92
-      'profile'  => array()
93
-    );
94
-
95
-    // Captcha
96
-    if (!$this->disableCaptcha)
97
-    {
98
-      $arrCaptcha = array
99
-      (
100
-        'id' => 'registration',
101
-        'label' => $GLOBALS['TL_LANG']['MSC']['securityQuestion'],
102
-        'type' => 'captcha',
103
-        'mandatory' => true,
104
-        'required' => true,
105
-        'tableless' => $this->tableless
106
-      );
107
-
108
-      /** @var \FormCaptcha $strClass */
109
-      $strClass = $GLOBALS['TL_FFL']['captcha'];
110
-
111
-      // Fallback to default if the class is not defined
112
-      if (!class_exists($strClass))
113
-      {
114
-        $strClass = 'FormCaptcha';
115
-      }
116
-
117
-      /** @var \FormCaptcha $objCaptcha */
118
-      $objCaptcha = new $strClass($arrCaptcha);
119
-
120
-      if (\Input::post('FORM_SUBMIT') == 'tl_registration')
121
-      {
122
-        $objCaptcha->validate();
123
-
124
-        if ($objCaptcha->hasErrors())
125
-        {
126
-          $doNotSubmit = true;
127
-        }
128
-      }
129
-    }
130
-
131
-    $arrUser = array();
132
-    $arrFields = array();
133
-    $hasUpload = false;
134
-    $i = 0;
135 56
 
136
-    // Build form
137
-    foreach ($this->editable as $fielddata)
57
+    $arrEditable = [];
58
+    foreach ($this->editable as $key=>$fielddata)
138 59
     {
139 60
       // Split formilicious editable data in single vars
140
-      list($field,$fieldWidth,$fieldClr,$fieldMandatory) = array_values($fielddata);
141
-
142
-      $arrData = $GLOBALS['TL_DCA']['tl_member']['fields'][$field];
143
-
144
-      // Map checkboxWizards to regular checkbox widgets
145
-      if ($arrData['inputType'] == 'checkboxWizard')
146
-      {
147
-        $arrData['inputType'] = 'checkbox';
148
-      }
149
-
150
-      // Map fileTrees to upload widgets (see #8091)
151
-      if ($arrData['inputType'] == 'fileTree')
152
-      {
153
-        $arrData['inputType'] = 'upload';
154
-      }
155
-
156
-      /** @var \Widget $strClass */
157
-      $strClass = $GLOBALS['TL_FFL'][$arrData['inputType']];
158
-
159
-      // Continue if the class is not defined
160
-      if (!class_exists($strClass))
161
-      {
162
-        continue;
163
-      }
164
-
165
-      $arrData['eval']['tableless'] = $this->tableless;
166
-      $arrData['eval']['required'] = $arrData['eval']['mandatory'];
167
-
168
-      $objWidget = new $strClass($strClass::getAttributesFromDca($arrData, $field, $arrData['default'], '', '', $this));
169
-
170
-      $objWidget->storeValues = true;
171
-      $objWidget->rowClass = 'row_' . $i . (($i == 0) ? ' row_first' : '') . ((($i % 2) == 0) ? ' even' : ' odd');
172
-
173
-      // Extend with formilicious data
174
-      $objWidget->eSM_fl_width = $fieldWidth;
175
-      $objWidget->eSM_fl_clear = $fieldClr;
61
+      list($field, $fieldWidth, $fieldClr, $fieldMandatory) = array_values($fielddata);
62
+      $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['eSM_fl_width'] = $fieldWidth;
63
+      $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['eSM_fl_clear'] = $fieldClr;
176 64
       if ($fieldMandatory)
177 65
       {
178
-        $objWidget->required = $fieldMandatory;
179
-        $objWidget->mandatory = $fieldMandatory;
66
+        $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['mandatory'] = $fieldMandatory;
180 67
       } else {
181
-        $objWidget->required = false;
182
-        $objWidget->mandatory = false;
183
-      }
184
-      if (in_array($arrData['eval']['rgxp'], array('date','time','datim')))
185
-      {
186
-        $strDateFormatFunc = 'getNumeric'.ucfirst($arrData['eval']['rgxp']).'Format';
187
-        $objWidget->placeholder = \Date::getInputFormat(\Date::$strDateFormatFunc());
188
-        $objWidget->maxlength = strlen($objWidget->placeholder);
189
-      }
190
-
191
-      // Increase the row count if its a password field
192
-      if ($objWidget instanceof \FormPassword)
193
-      {
194
-        $objWidget->rowClassConfirm = 'row_' . ++$i . ((($i % 2) == 0) ? ' even' : ' odd');
195
-      }
196
-
197
-      // Validate input
198
-      if (\Input::post('FORM_SUBMIT') == 'tl_registration')
199
-      {
200
-        $objWidget->validate();
201
-        $varValue = $objWidget->value;
202
-
203
-        // Check whether the password matches the username
204
-        if ($objWidget instanceof \FormPassword && \Encryption::verify(\Input::post('username'), $varValue))
205
-        {
206
-          $objWidget->addError($GLOBALS['TL_LANG']['ERR']['passwordName']);
207
-        }
208
-
209
-        $rgxp = $arrData['eval']['rgxp'];
210
-
211
-        // Convert date formats into timestamps (check the eval setting first -> #3063)
212
-        if ($varValue != '' && in_array($rgxp, array('date', 'time', 'datim')))
213
-        {
214
-          try
215
-          {
216
-            $objDate = new \Date($varValue, \Date::getFormatFromRgxp($rgxp));
217
-            $varValue = $objDate->tstamp;
218
-          }
219
-          catch (\OutOfBoundsException $e)
220
-          {
221
-            $objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['invalidDate'], $varValue));
222
-          }
223
-        }
224
-
225
-        // Make sure that unique fields are unique (check the eval setting first -> #3063)
226
-        if ($arrData['eval']['unique'] && $varValue != '' && !$this->Database->isUniqueValue('tl_member', $field, $varValue))
227
-        {
228
-          $objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['unique'], $arrData['label'][0] ?: $field));
229
-        }
230
-
231
-        // Save callback
232
-        if ($objWidget->submitInput() && !$objWidget->hasErrors() && is_array($arrData['save_callback']))
233
-        {
234
-          foreach ($arrData['save_callback'] as $callback)
235
-          {
236
-            try
237
-            {
238
-              if (is_array($callback))
239
-              {
240
-                $this->import($callback[0]);
241
-                $varValue = $this->{$callback[0]}->{$callback[1]}($varValue, null);
242
-              }
243
-              elseif (is_callable($callback))
244
-              {
245
-                $varValue = $callback($varValue, null);
246
-              }
247
-            }
248
-            catch (\Exception $e)
249
-            {
250
-              $objWidget->class = 'error';
251
-              $objWidget->addError($e->getMessage());
252
-            }
253
-          }
254
-        }
68
+        $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['mandatory'] = false;
255 69
 
256
-        // Store the current value
257
-        if ($objWidget->hasErrors())
258
-        {
259
-          $doNotSubmit = true;
260
-        }
261
-        elseif ($objWidget->submitInput())
262
-        {
263
-          // Set the correct empty value (see #6284, #6373)
264
-          if ($varValue === '')
265
-          {
266
-            $varValue = $objWidget->getEmptyValue();
267
-          }
268
-
269
-          // Encrypt the value (see #7815)
270
-          if ($arrData['eval']['encrypt'])
271
-          {
272
-            $varValue = \Encryption::encrypt($varValue);
273
-          }
274
-
275
-          // Set the new value
276
-          $arrUser[$field] = $varValue;
277
-        }
278
-      }
279
-
280
-      if ($objWidget instanceof \uploadable)
281
-      {
282
-        $hasUpload = true;
283 70
       }
284
-
285
-      $temp = $objWidget->parse();
286
-
287
-      $this->Template->fields .= $temp;
288
-      $arrFields[$arrData['eval']['feGroup']][$field] .= $temp;
289
-
290
-      ++$i;
291
-    }
292
-
293
-    // Captcha
294
-    if (!$this->disableCaptcha)
295
-    {
296
-      $objCaptcha->rowClass = 'row_'.$i . (($i == 0) ? ' row_first' : '') . ((($i % 2) == 0) ? ' even' : ' odd');
297
-      $strCaptcha = $objCaptcha->parse();
298
-
299
-      $this->Template->fields .= $strCaptcha;
300
-      $arrFields['captcha']['captcha'] .= $strCaptcha;
301
-    }
302
-
303
-    $this->Template->rowLast = 'row_' . ++$i . ((($i % 2) == 0) ? ' even' : ' odd');
304
-    $this->Template->enctype = $hasUpload ? 'multipart/form-data' : 'application/x-www-form-urlencoded';
305
-    $this->Template->hasError = $doNotSubmit;
306
-
307
-    // Create new user if there are no errors
308
-    if (\Input::post('FORM_SUBMIT') == 'tl_registration' && !$doNotSubmit)
309
-    {
310
-      $this->createNewUser($arrUser);
71
+      $arrEditable[$key] = $field;
311 72
     }
73
+    $this->editable = $arrEditable;
312 74
 
313
-    $this->Template->loginDetails = $GLOBALS['TL_LANG']['tl_member']['loginDetails'];
314
-    $this->Template->addressDetails = $GLOBALS['TL_LANG']['tl_member']['addressDetails'];
315
-    $this->Template->contactDetails = $GLOBALS['TL_LANG']['tl_member']['contactDetails'];
316
-    $this->Template->personalData = $GLOBALS['TL_LANG']['tl_member']['personalData'];
317
-    $this->Template->captchaDetails = $GLOBALS['TL_LANG']['MSC']['securityQuestion'];
318
-
319
-    // Add the groups
320
-    foreach ($arrFields as $k=>$v)
321
-    {
322
-      $this->Template->$k = $v; // backwards compatibility
323
-
324
-      $key = $k . (($k == 'personal') ? 'Data' : 'Details');
325
-      $arrGroups[$GLOBALS['TL_LANG']['tl_member'][$key]] = $v;
326
-    }
75
+    parent::compile();
327 76
 
328
-    $this->Template->categories = $arrGroups;
329
-    $this->Template->formId = 'tl_registration';
330
-    $this->Template->slabel = specialchars($GLOBALS['TL_LANG']['MSC']['register']);
331
-    $this->Template->action = \Environment::get('indexFreeRequest');
332
-    $this->Template->captcha = $arrFields['captcha']['captcha']; // backwards compatibility
333 77
   }
334 78
 }