Browse code

Reimplement extended registration and personal data form handling

Benjamin Roth authored on22/03/2023 12:59:10
Showing7 changed files
... ...
@@ -12,7 +12,8 @@
12 12
   ],
13 13
   "require":{
14 14
     "php": "^7.4 || ^8.0",
15
-    "contao/core-bundle": "^4.13 || 5.0"
15
+    "contao/core-bundle": "^4.13 || 5.0",
16
+    "menatwork/contao-multicolumnwizard-bundle": "^3.5"
16 17
   },
17 18
   "conflict": {
18 19
     "contao/manager-plugin": "<2.0 || >=3.0"
... ...
@@ -15,6 +15,6 @@
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 17
 $GLOBALS['TL_HOOKS']['loadFormField'][] = array('\FormiliciousHooks','eSMLoadFormField');
18
-$GLOBALS['TL_HOOKS']['getAttributesFromDca'][] = array('\FormiliciousHooks','eSMGetAttributesFromDca');
19
-$GLOBALS['FE_MOD']['user']['registration'] = '\eSM_formilicious\ModuleRegistration';
20
-$GLOBALS['FE_MOD']['user']['personalData'] = '\eSM_formilicious\ModulePersonalData';*/
18
+$GLOBALS['TL_HOOKS']['getAttributesFromDca'][] = array('\FormiliciousHooks','eSMGetAttributesFromDca');*/
19
+$GLOBALS['FE_MOD']['user']['registration'] = '\vonRotenberg\FormiliciousBundle\Controller\Frontend\Module\ModuleRegistration';
20
+$GLOBALS['FE_MOD']['user']['personalData'] = '\vonRotenberg\FormiliciousBundle\Controller\Frontend\Module\ModulePersonalData';
... ...
@@ -29,7 +29,8 @@ input[type="number"],input[type="search"],input[type="tel"],input[type="time"],i
29 29
 /**
30 30
  * Fieldset Styles
31 31
  */
32
-.formbody {
32
+.formbody,
33
+.formbody > .fields:not(.widget) {
33 34
 	display: grid;
34 35
 	grid-gap: 10px;
35 36
 	row-gap: 0.75em;
... ...
@@ -1 +1 @@
1
-input[type=date],input[type=datetime],input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],select,textarea{width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.widget input.captcha{max-width:4em}.formbody{display:grid;grid-gap:10px;row-gap:.75em;grid-template-columns:repeat(12,1fr);align-items:end}.formbody>:not(.widget){grid-column:auto/span 12}.formbody>fieldset{grid-column-start:1;grid-column:auto/span 12;display:grid;grid-gap:10px;row-gap:.75em;grid-template-columns:repeat(12,1fr);align-items:end}.formbody .widget label{display:block;margin-bottom:.4em;line-height:1.5em}.formbody .submit_container.fl_right_alignment,.formbody .widget.fl_right_alignment{text-align:right}.formbody .submit_container.fl_center_alignment,.formbody .widget.fl_center_alignment{text-align:center}.formbody .submit_container.fl_left_alignment,.formbody .widget.fl_left_alignment{text-align:left}.widget.lblp{padding-top:1.9em}.formbody .widget.w10,.formbody .widget.w11,.formbody .widget.w15,.formbody .widget.w16_5{grid-column:auto/span 2}.formbody .widget.w20,.formbody .widget.w22,.formbody .widget.w25{grid-column:auto/span 3}.formbody .widget.w30,.formbody .widget.w33{grid-column:auto/span 4}.formbody .widget.w35,.formbody .widget.w40{grid-column:auto/span 5}.formbody .widget.w44,.formbody .widget.w45,.formbody .widget.w50{grid-column:auto/span 6}.formbody .widget.w55{grid-column:auto/span 7}.formbody .widget.w60,.formbody .widget.w65,.formbody .widget.w66{grid-column:auto/span 8}.formbody .widget.w70,.formbody .widget.w75{grid-column:auto/span 9}.formbody .widget.w80{grid-column:auto/span 10}.formbody .widget.w85,.formbody .widget.w90,.formbody .widget.w95{grid-column:auto/span 11}.formbody .widget.w100{grid-column:auto/span 12}.formbody .widget.clr{grid-column-start:1}@media screen and (max-width:599px){.formbody .widget.w10,.formbody .widget.w100,.formbody .widget.w11,.formbody .widget.w15,.formbody .widget.w16_5,.formbody .widget.w20,.formbody .widget.w22,.formbody .widget.w25,.formbody .widget.w30,.formbody .widget.w33,.formbody .widget.w35,.formbody .widget.w40,.formbody .widget.w44,.formbody .widget.w45,.formbody .widget.w50,.formbody .widget.w55,.formbody .widget.w60,.formbody .widget.w65,.formbody .widget.w66,.formbody .widget.w70,.formbody .widget.w75,.formbody .widget.w80,.formbody .widget.w85,.formbody .widget.w90,.formbody .widget.w95{grid-column:auto/span 12;grid-column-start:1}}
2 1
\ No newline at end of file
2
+input[type=date],input[type=datetime],input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],select,textarea{width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.widget input.captcha{max-width:4em}.formbody,.formbody>.fields:not(.widget){display:grid;grid-gap:10px;row-gap:.75em;grid-template-columns:repeat(12,1fr);align-items:end}.formbody>:not(.widget){grid-column:auto/span 12}.formbody>fieldset{grid-column-start:1;grid-column:auto/span 12;display:grid;grid-gap:10px;row-gap:.75em;grid-template-columns:repeat(12,1fr);align-items:end}.formbody .widget label{display:block;margin-bottom:.4em;line-height:1.5em}.formbody .submit_container.fl_right_alignment,.formbody .widget.fl_right_alignment{text-align:right}.formbody .submit_container.fl_center_alignment,.formbody .widget.fl_center_alignment{text-align:center}.formbody .submit_container.fl_left_alignment,.formbody .widget.fl_left_alignment{text-align:left}.widget.lblp{padding-top:1.9em}.formbody .widget.w10,.formbody .widget.w11,.formbody .widget.w15,.formbody .widget.w16_5{grid-column:auto/span 2}.formbody .widget.w20,.formbody .widget.w22,.formbody .widget.w25{grid-column:auto/span 3}.formbody .widget.w30,.formbody .widget.w33{grid-column:auto/span 4}.formbody .widget.w35,.formbody .widget.w40{grid-column:auto/span 5}.formbody .widget.w44,.formbody .widget.w45,.formbody .widget.w50{grid-column:auto/span 6}.formbody .widget.w55{grid-column:auto/span 7}.formbody .widget.w60,.formbody .widget.w65,.formbody .widget.w66{grid-column:auto/span 8}.formbody .widget.w70,.formbody .widget.w75{grid-column:auto/span 9}.formbody .widget.w80{grid-column:auto/span 10}.formbody .widget.w85,.formbody .widget.w90,.formbody .widget.w95{grid-column:auto/span 11}.formbody .widget,.formbody .widget.w100{grid-column:auto/span 12}.formbody .widget.clr{grid-column-start:1}@media screen and (max-width:599px){.formbody .widget.w10,.formbody .widget.w100,.formbody .widget.w11,.formbody .widget.w15,.formbody .widget.w16_5,.formbody .widget.w20,.formbody .widget.w22,.formbody .widget.w25,.formbody .widget.w30,.formbody .widget.w33,.formbody .widget.w35,.formbody .widget.w40,.formbody .widget.w44,.formbody .widget.w45,.formbody .widget.w50,.formbody .widget.w55,.formbody .widget.w60,.formbody .widget.w65,.formbody .widget.w66,.formbody .widget.w70,.formbody .widget.w75,.formbody .widget.w80,.formbody .widget.w85,.formbody .widget.w90,.formbody .widget.w95{grid-column:auto/span 12;grid-column-start:1}}
3 3
\ No newline at end of file
4 4
new file mode 100644
... ...
@@ -0,0 +1,82 @@
1
+<?php
2
+
3
+/**
4
+ * eSales Media Formilicious for Contao Open Source CMS
5
+ *
6
+ * Copyright (C) 2013-2014 eSalesMedia
7
+ *
8
+ * @package    eSM_formilicious
9
+ * @link       http://www.esales-media.de
10
+ * @license    http://www.gnu.org/licenses/lgpl-3.0.html LGPL
11
+ *
12
+ * @author     Benjamin Roth <benjamin@esales-media.de>
13
+ */
14
+
15
+
16
+/**
17
+ * Run in a custom namespace, so the class can be replaced
18
+ */
19
+namespace vonRotenberg\FormiliciousBundle\Controller\Frontend\Module;
20
+
21
+use Contao\ModulePersonalData as OrgModulePersonalData;
22
+use Contao\PageModel;
23
+use Contao\System;
24
+
25
+/**
26
+ * Class ModulePersonalData
27
+ *
28
+ * Front end module "personal data".
29
+ * @copyright  Leo Feyer 2005-2014
30
+ * @author     Leo Feyer <https://contao.org>
31
+ * @package    Core
32
+ */
33
+class ModulePersonalData extends OrgModulePersonalData
34
+{
35
+
36
+  public function generate()
37
+  {
38
+    $this->loadDataContainer('tl_member');
39
+    $originalDca = $GLOBALS['TL_DCA']['tl_member'];
40
+    $return = parent::generate();
41
+    $GLOBALS['TL_DCA']['tl_member'] = $originalDca;
42
+
43
+    return $return;
44
+  }
45
+
46
+
47
+  /**
48
+   * Generate the module
49
+   */
50
+  protected function compile()
51
+  {
52
+    /** @var PageModel $objPage */
53
+    global $objPage;
54
+
55
+    $GLOBALS['TL_LANGUAGE'] = $objPage->language;
56
+
57
+    System::loadLanguageFile('tl_member');
58
+    $this->loadDataContainer('tl_member');
59
+
60
+
61
+    $arrEditable = [];
62
+    foreach ($this->editable as $key=>$fielddata)
63
+    {
64
+      // Split formilicious editable data in single vars
65
+      list($field, $fieldWidth, $fieldClr, $fieldMandatory) = array_values($fielddata);
66
+      $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['eSM_fl_width'] = $fieldWidth;
67
+      $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['eSM_fl_clear'] = $fieldClr;
68
+      if ($fieldMandatory)
69
+      {
70
+        $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['mandatory'] = $fieldMandatory;
71
+      } else {
72
+        $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['mandatory'] = false;
73
+
74
+      }
75
+      $arrEditable[$key] = $field;
76
+    }
77
+    $this->editable = $arrEditable;
78
+
79
+    parent::compile();
80
+
81
+  }
82
+}
0 83
new file mode 100644
... ...
@@ -0,0 +1,81 @@
1
+<?php
2
+
3
+/**
4
+ * eSales Media Formilicious for Contao Open Source CMS
5
+ *
6
+ * Copyright (C) 2013-2014 eSalesMedia
7
+ *
8
+ * @package    eSM_formilicious
9
+ * @link       http://www.esales-media.de
10
+ * @license    http://www.gnu.org/licenses/lgpl-3.0.html LGPL
11
+ *
12
+ * @author     Benjamin Roth <benjamin@esales-media.de>
13
+ */
14
+
15
+
16
+/**
17
+ * Run in a custom namespace, so the class can be replaced
18
+ */
19
+namespace vonRotenberg\FormiliciousBundle\Controller\Frontend\Module;
20
+
21
+use Contao\ModuleRegistration as OrgModuleRegistration;
22
+use Contao\PageModel;
23
+use Contao\System;
24
+
25
+/**
26
+ * Class ModuleRegistration
27
+ *
28
+ * Front end module "registration".
29
+ * @copyright  Leo Feyer 2005-2014
30
+ * @author     Leo Feyer <https://contao.org>
31
+ * @package    Core
32
+ */
33
+class ModuleRegistration extends OrgModuleRegistration
34
+{
35
+  protected $originalDca;
36
+
37
+  public function generate()
38
+  {
39
+    $return = parent::generate();
40
+    $GLOBALS['TL_DCA']['tl_member'] = $this->originalDca;
41
+
42
+    return $return;
43
+  }
44
+
45
+
46
+  /**
47
+   * Generate the module
48
+   */
49
+  protected function compile()
50
+  {
51
+    /** @var PageModel $objPage */
52
+    global $objPage;
53
+
54
+    $GLOBALS['TL_LANGUAGE'] = $objPage->language;
55
+
56
+    System::loadLanguageFile('tl_member');
57
+    $this->loadDataContainer('tl_member');
58
+    $this->originalDca = $GLOBALS['TL_DCA']['tl_member'];
59
+
60
+    $arrEditable = [];
61
+    foreach ($this->editable as $key=>$fielddata)
62
+    {
63
+      // Split formilicious editable data in single vars
64
+      list($field, $fieldWidth, $fieldClr, $fieldMandatory) = array_values($fielddata);
65
+      $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['eSM_fl_width'] = $fieldWidth;
66
+      $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['eSM_fl_clear'] = $fieldClr;
67
+      if ($fieldMandatory)
68
+      {
69
+        $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['mandatory'] = $fieldMandatory;
70
+      } else {
71
+        $GLOBALS['TL_DCA']['tl_member']['fields'][$field]['eval']['mandatory'] = false;
72
+
73
+      }
74
+      $arrEditable[$key] = $field;
75
+    }
76
+    $this->editable = $arrEditable;
77
+
78
+    parent::compile();
79
+
80
+  }
81
+}
0 82
new file mode 100644
... ...
@@ -0,0 +1,90 @@
1
+<?php
2
+
3
+declare(strict_types=1);
4
+
5
+/*
6
+ * This file is part of formilicious bundle for Contao.
7
+ *
8
+ * (c) Benjamin Roth
9
+ *
10
+ * @license LGPL-3.0-or-later
11
+ */
12
+
13
+namespace vonRotenberg\FormiliciousBundle\EventListener;
14
+
15
+use Contao\Controller;
16
+use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
17
+use Contao\DataContainer;
18
+
19
+#[AsHook('getAttributesFromDca')]
20
+class GetAttributesFromDca
21
+{
22
+    public function __invoke(array $arrAttributes, $context): array
23
+    {
24
+        if ($context instanceof DataContainer && $context->field)
25
+        {
26
+            Controller::loadDataContainer($context->table);
27
+            $arrData = $GLOBALS['TL_DCA'][$context->table]['fields'][$context->field];
28
+
29
+            if (isset($arrData['eval']['eSM_fl_width']))
30
+            {
31
+                $arrAttributes['eSM_fl_width'] = $arrData['eval']['eSM_fl_width'];
32
+            }
33
+
34
+            if (isset($arrData['eval']['eSM_fl_clear']))
35
+            {
36
+                $arrAttributes['eSM_fl_clear'] = $arrData['eval']['eSM_fl_clear'];
37
+            }
38
+
39
+            if (isset($arrData['eval']['eSM_fl_class']))
40
+            {
41
+                $arrAttributes['eSM_fl_class'] = $arrData['eval']['eSM_fl_class'];
42
+            }
43
+
44
+            if (isset($arrData['eval']['eSM_fl_lblpadding']))
45
+            {
46
+                $arrAttributes['eSM_fl_lblpadding'] = $arrData['eval']['eSM_fl_lblpadding'];
47
+            }
48
+
49
+            if (isset($arrData['eval']['eSM_fl_alignment']))
50
+            {
51
+                $arrAttributes['eSM_fl_alignment'] = $arrData['eval']['eSM_fl_alignment'];
52
+            }
53
+        }
54
+
55
+        if (!isset($arrAttributes['class']))
56
+        {
57
+            $arrAttributes['class'] = '';
58
+        }
59
+
60
+        if (isset($arrAttributes['eSM_fl_width']) && is_numeric($arrAttributes['eSM_fl_width']))
61
+        {
62
+            $arrAttributes['class'].= ' w' . $arrAttributes['eSM_fl_width'];
63
+        }
64
+
65
+        if (isset($arrAttributes['eSM_fl_class']))
66
+        {
67
+            $arrAttributes['class'].= ' ' . $arrAttributes['eSM_fl_class'];
68
+        }
69
+
70
+        if (isset($arrAttributes['eSM_fl_width']))
71
+        {
72
+            $arrAttributes['class'].= ' clr';
73
+        }
74
+
75
+        if (isset($arrAttributes['type']) && $arrAttributes['type'] === 'submit')
76
+        {
77
+            if (isset($arrAttributes['eSM_fl_lblpadding']))
78
+            {
79
+                $arrAttributes['class'].= ' lblp';
80
+            }
81
+
82
+            if (isset($arrAttributes['eSM_fl_alignment']))
83
+            {
84
+                $arrAttributes['class'].= ' ' . $arrAttributes['eSM_fl_alignment'].'_alignment';
85
+            }
86
+        }
87
+
88
+        return $arrAttributes;
89
+    }
90
+}