xref: /plugin/combo/action/profile.php (revision 9337a630db122fdba0294f47d72bdf5433c2bf10)
1*9337a630SNickeau<?php
2*9337a630SNickeau
3*9337a630SNickeauuse ComboStrap\Bootstrap;
4*9337a630SNickeauuse ComboStrap\Identity;
5*9337a630SNickeauuse ComboStrap\LogUtility;
6*9337a630SNickeauuse ComboStrap\PluginUtility;
7*9337a630SNickeauuse ComboStrap\Snippet;
8*9337a630SNickeau
9*9337a630SNickeauif (!defined('DOKU_INC')) die();
10*9337a630SNickeaurequire_once(__DIR__ . '/../class/PluginUtility.php');
11*9337a630SNickeau
12*9337a630SNickeau/**
13*9337a630SNickeau *
14*9337a630SNickeau */
15*9337a630SNickeauclass action_plugin_combo_profile extends DokuWiki_Action_Plugin
16*9337a630SNickeau{
17*9337a630SNickeau
18*9337a630SNickeau    const CANONICAL = Identity::CANONICAL;
19*9337a630SNickeau    const TAG_UPDATE = "profile-update";
20*9337a630SNickeau    const TAG_DELETE = "profile-delete";
21*9337a630SNickeau    const FORM_PROFILE_UPDATE_CLASS = "form-" . self::TAG_UPDATE;
22*9337a630SNickeau    const FORM_PROFILE_DELETE_CLASS = "form-" . self::TAG_DELETE;
23*9337a630SNickeau    const CONF_ENABLE_PROFILE_UPDATE_FORM = "enableProfileUpdateForm";
24*9337a630SNickeau    const CONF_ENABLE_PROFILE_DELETE_FORM = "enableProfileDeleteForm";
25*9337a630SNickeau
26*9337a630SNickeau
27*9337a630SNickeau
28*9337a630SNickeau    function register(Doku_Event_Handler $controller)
29*9337a630SNickeau    {
30*9337a630SNickeau        /**
31*9337a630SNickeau         * To modify the profile update form and add class
32*9337a630SNickeau         *
33*9337a630SNickeau         * Deprecated object passed by the event but still in use
34*9337a630SNickeau         * https://www.dokuwiki.org/devel:event:html_updateprofileform_output
35*9337a630SNickeau         *
36*9337a630SNickeau         * Event using the new object but not found anywhere
37*9337a630SNickeau         * https://www.dokuwiki.org/devel:event:form_updateprofile_output
38*9337a630SNickeau         */
39*9337a630SNickeau        if (PluginUtility::getConfValue(self::CONF_ENABLE_PROFILE_UPDATE_FORM,1)) {
40*9337a630SNickeau            $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this, 'handle_profile_update', array());
41*9337a630SNickeau        }
42*9337a630SNickeau
43*9337a630SNickeau        /**
44*9337a630SNickeau         * To modify the register form and add class
45*9337a630SNickeau         *
46*9337a630SNickeau         * Deprecated object passed by the event but still in use
47*9337a630SNickeau         * https://www.dokuwiki.org/devel:event:html_profiledeleteform_output
48*9337a630SNickeau         *
49*9337a630SNickeau         * Event using the new object but not found anywhere
50*9337a630SNickeau         * https://www.dokuwiki.org/devel:event:form_profiledelete_output
51*9337a630SNickeau         */
52*9337a630SNickeau        if (PluginUtility::getConfValue(self::CONF_ENABLE_PROFILE_DELETE_FORM,1)) {
53*9337a630SNickeau            $controller->register_hook('HTML_PROFILEDELETEFORM_OUTPUT', 'BEFORE', $this, 'handle_profile_delete', array());
54*9337a630SNickeau        }
55*9337a630SNickeau
56*9337a630SNickeau
57*9337a630SNickeau
58*9337a630SNickeau
59*9337a630SNickeau    }
60*9337a630SNickeau
61*9337a630SNickeau    function handle_profile_update(&$event, $param)
62*9337a630SNickeau    {
63*9337a630SNickeau
64*9337a630SNickeau        /**
65*9337a630SNickeau         * The profile page is created via buffer
66*9337a630SNickeau         * We print before the forms to avoid a FOUC
67*9337a630SNickeau         */
68*9337a630SNickeau        print Snippet::createCssSnippet(self::TAG_UPDATE)
69*9337a630SNickeau            ->getHtmlStyleTag();
70*9337a630SNickeau
71*9337a630SNickeau        /**
72*9337a630SNickeau         * @var Doku_Form $form
73*9337a630SNickeau         */
74*9337a630SNickeau        $form = &$event->data;
75*9337a630SNickeau        $class = &$form->params["class"];
76*9337a630SNickeau        if (isset($class)) {
77*9337a630SNickeau            $class = $class . " " . self::FORM_PROFILE_UPDATE_CLASS;
78*9337a630SNickeau        } else {
79*9337a630SNickeau            $class = self::FORM_PROFILE_UPDATE_CLASS;
80*9337a630SNickeau        }
81*9337a630SNickeau        $newFormContent = [];
82*9337a630SNickeau
83*9337a630SNickeau        /**
84*9337a630SNickeau         * Header (Logo / Title)
85*9337a630SNickeau         */
86*9337a630SNickeau        $newFormContent[] = Identity::getHeaderHTML($form, self::FORM_PROFILE_UPDATE_CLASS);
87*9337a630SNickeau
88*9337a630SNickeau
89*9337a630SNickeau        /**
90*9337a630SNickeau         * Form Attributes
91*9337a630SNickeau         * https://getbootstrap.com/docs/5.0/forms/layout/#horizontal-form
92*9337a630SNickeau         */
93*9337a630SNickeau        $rowClass = "row";
94*9337a630SNickeau        if (Bootstrap::getBootStrapMajorVersion() == Bootstrap::BootStrapFourMajorVersion) {
95*9337a630SNickeau            $rowClass .= " form-group";
96*9337a630SNickeau        }
97*9337a630SNickeau        $firstColWeight = 5;
98*9337a630SNickeau        $secondColWeight = 12 - $firstColWeight;
99*9337a630SNickeau
100*9337a630SNickeau
101*9337a630SNickeau        /**
102*9337a630SNickeau         * Replace the field
103*9337a630SNickeau         *
104*9337a630SNickeau         * The password text localized by lang is shared
105*9337a630SNickeau         * between the password and the password check field
106*9337a630SNickeau         */
107*9337a630SNickeau        $passwordText = "Password";
108*9337a630SNickeau        foreach ($form->_content as $field) {
109*9337a630SNickeau            if (!is_array($field)) {
110*9337a630SNickeau                continue;
111*9337a630SNickeau            }
112*9337a630SNickeau            $fieldName = $field["name"];
113*9337a630SNickeau            if ($fieldName == null) {
114*9337a630SNickeau                // this is not an input field
115*9337a630SNickeau                switch ($field["type"]) {
116*9337a630SNickeau                    case "submit":
117*9337a630SNickeau                        /**
118*9337a630SNickeau                         * This is important to keep the submit element intact
119*9337a630SNickeau                         * for forms integration such as captcha
120*9337a630SNickeau                         * The search the submit button to insert before it
121*9337a630SNickeau                         */
122*9337a630SNickeau                        $classes = "btn btn-primary";
123*9337a630SNickeau                        if (isset($field["class"])) {
124*9337a630SNickeau                            $field["class"] = $field["class"] . " " . $classes;
125*9337a630SNickeau                        } else {
126*9337a630SNickeau                            $field["class"] = $classes;
127*9337a630SNickeau                        }
128*9337a630SNickeau                        $field["tabindex"] = "6";
129*9337a630SNickeau                        $newFormContent[] = $field;
130*9337a630SNickeau                        break;
131*9337a630SNickeau                    case "reset":
132*9337a630SNickeau                        $classes = "btn btn-secondary";
133*9337a630SNickeau                        if (isset($field["class"])) {
134*9337a630SNickeau                            $field["class"] = $field["class"] . " " . $classes;
135*9337a630SNickeau                        } else {
136*9337a630SNickeau                            $field["class"] = $classes;
137*9337a630SNickeau                        }
138*9337a630SNickeau                        $field["tabindex"] = "7";
139*9337a630SNickeau                        $newFormContent[] = $field;
140*9337a630SNickeau                        break;
141*9337a630SNickeau                }
142*9337a630SNickeau                continue;
143*9337a630SNickeau            }
144*9337a630SNickeau            switch ($fieldName) {
145*9337a630SNickeau                case "login":
146*9337a630SNickeau                    $loginText = $field["_text"];
147*9337a630SNickeau                    $loginValue = $field["value"];
148*9337a630SNickeau                    $loginHTML = <<<EOF
149*9337a630SNickeau<div class="$rowClass">
150*9337a630SNickeau    <label for="inputUserName" class="col-sm-$firstColWeight col-form-label">$loginText</label>
151*9337a630SNickeau    <div class="col-sm-$secondColWeight">
152*9337a630SNickeau      <input type="text" class="form-control" id="inputUserName" placeholder="Username" name="$fieldName" value="$loginValue" disabled>
153*9337a630SNickeau    </div>
154*9337a630SNickeau</div>
155*9337a630SNickeauEOF;
156*9337a630SNickeau                    $newFormContent[] = $loginHTML;
157*9337a630SNickeau                    break;
158*9337a630SNickeau                case "fullname":
159*9337a630SNickeau                    $fullNameText = $field["_text"];
160*9337a630SNickeau                    $fullNameValue = $field["value"];
161*9337a630SNickeau                    $fullNameHtml = <<<EOF
162*9337a630SNickeau<div class="$rowClass">
163*9337a630SNickeau    <label for="inputRealName" class="col-sm-$firstColWeight col-form-label">$fullNameText</label>
164*9337a630SNickeau    <div class="col-sm-$secondColWeight">
165*9337a630SNickeau      <input type="text" class="form-control" id="inputRealName" placeholder="$fullNameText" tabindex="1" name="$fieldName" value="$fullNameValue" required="required">
166*9337a630SNickeau    </div>
167*9337a630SNickeau</div>
168*9337a630SNickeauEOF;
169*9337a630SNickeau                    $newFormContent[] = $fullNameHtml;
170*9337a630SNickeau                    break;
171*9337a630SNickeau                case "email":
172*9337a630SNickeau                    $emailText = $field["_text"];
173*9337a630SNickeau                    $emailValue = $field["value"];
174*9337a630SNickeau                    $emailHTML = <<<EOF
175*9337a630SNickeau<div class="$rowClass">
176*9337a630SNickeau    <label for="inputEmail" class="col-sm-$firstColWeight col-form-label">$emailText</label>
177*9337a630SNickeau    <div class="col-sm-$secondColWeight">
178*9337a630SNickeau      <input type="email" class="form-control" id="inputEmail" placeholder="name@example.com" tabindex="2" name="$fieldName" value="$emailValue" required="required">
179*9337a630SNickeau    </div>
180*9337a630SNickeau</div>
181*9337a630SNickeauEOF;
182*9337a630SNickeau                    $newFormContent[] = $emailHTML;
183*9337a630SNickeau                    break;
184*9337a630SNickeau                case "newpass":
185*9337a630SNickeau                    $passwordText = $field["_text"];
186*9337a630SNickeau                    $passwordHtml = <<<EOF
187*9337a630SNickeau<div class="$rowClass">
188*9337a630SNickeau    <label for="inputPassword" class="col-sm-$firstColWeight col-form-label">$passwordText</label>
189*9337a630SNickeau    <div class="col-sm-$secondColWeight">
190*9337a630SNickeau      <input type="password" class="form-control" id="inputPassword" placeholder="$passwordText" tabindex="3" name="$fieldName">
191*9337a630SNickeau    </div>
192*9337a630SNickeau</div>
193*9337a630SNickeauEOF;
194*9337a630SNickeau                    $newFormContent[] = $passwordHtml;
195*9337a630SNickeau                    break;
196*9337a630SNickeau                case "passchk":
197*9337a630SNickeau                    $passwordCheckText = $field["_text"];
198*9337a630SNickeau                    $passwordCheckHtml = <<<EOF
199*9337a630SNickeau<div class="$rowClass">
200*9337a630SNickeau    <label for="inputPasswordCheck" class="col-sm-$firstColWeight col-form-label">$passwordCheckText</label>
201*9337a630SNickeau    <div class="col-sm-$secondColWeight">
202*9337a630SNickeau      <input type="password" class="form-control" id="inputPasswordCheck" placeholder="$passwordText" tabindex="4" name="$fieldName">
203*9337a630SNickeau    </div>
204*9337a630SNickeau</div>
205*9337a630SNickeauEOF;
206*9337a630SNickeau                    $newFormContent[] = $passwordCheckHtml;
207*9337a630SNickeau                    break;
208*9337a630SNickeau                case "oldpass":
209*9337a630SNickeau                    $passwordCheckText = $field["_text"];
210*9337a630SNickeau                    $passwordCheckHtml = <<<EOF
211*9337a630SNickeau<div class="$rowClass">
212*9337a630SNickeau    <label for="inputPasswordCheck" class="col-sm-$firstColWeight col-form-label">$passwordCheckText</label>
213*9337a630SNickeau    <div class="col-sm-$secondColWeight">
214*9337a630SNickeau      <input type="password" class="form-control" id="inputPasswordCheck" placeholder="$passwordCheckText" tabindex="5" name="$fieldName" required="required">
215*9337a630SNickeau    </div>
216*9337a630SNickeau</div>
217*9337a630SNickeauEOF;
218*9337a630SNickeau                    $newFormContent[] = $passwordCheckHtml;
219*9337a630SNickeau                    break;
220*9337a630SNickeau
221*9337a630SNickeau
222*9337a630SNickeau                default:
223*9337a630SNickeau                    $tag = self::TAG_UPDATE;
224*9337a630SNickeau                    LogUtility::msg("The $tag field name ($fieldName) is unknown", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
225*9337a630SNickeau
226*9337a630SNickeau            }
227*9337a630SNickeau        }
228*9337a630SNickeau
229*9337a630SNickeau
230*9337a630SNickeau        /**
231*9337a630SNickeau         * Update
232*9337a630SNickeau         */
233*9337a630SNickeau        $form->_content = $newFormContent;
234*9337a630SNickeau        return true;
235*9337a630SNickeau
236*9337a630SNickeau
237*9337a630SNickeau    }
238*9337a630SNickeau
239*9337a630SNickeau    public function handle_profile_delete($event,$param){
240*9337a630SNickeau
241*9337a630SNickeau        /**
242*9337a630SNickeau         * The profile page is created via buffer
243*9337a630SNickeau         * We print before the forms to avoid a FOUC
244*9337a630SNickeau         */
245*9337a630SNickeau        print Snippet::createCssSnippet(self::TAG_DELETE)
246*9337a630SNickeau            ->getHtmlStyleTag();
247*9337a630SNickeau
248*9337a630SNickeau        /**
249*9337a630SNickeau         * @var Doku_Form $form
250*9337a630SNickeau         */
251*9337a630SNickeau        $form = &$event->data;
252*9337a630SNickeau        $class = &$form->params["class"];
253*9337a630SNickeau        if (isset($class)) {
254*9337a630SNickeau            $class = $class . " " . self::FORM_PROFILE_DELETE_CLASS;
255*9337a630SNickeau        } else {
256*9337a630SNickeau            $class = self::FORM_PROFILE_DELETE_CLASS;
257*9337a630SNickeau        }
258*9337a630SNickeau        $newFormContent = [];
259*9337a630SNickeau
260*9337a630SNickeau        /**
261*9337a630SNickeau         * Header (Logo / Title)
262*9337a630SNickeau         */
263*9337a630SNickeau        $newFormContent[] = Identity::getHeaderHTML($form, self::FORM_PROFILE_DELETE_CLASS,false);
264*9337a630SNickeau
265*9337a630SNickeau        /**
266*9337a630SNickeau         * Field
267*9337a630SNickeau         */
268*9337a630SNickeau        foreach ($form->_content as $field) {
269*9337a630SNickeau            if (!is_array($field)) {
270*9337a630SNickeau                continue;
271*9337a630SNickeau            }
272*9337a630SNickeau            $fieldName = $field["name"];
273*9337a630SNickeau            if ($fieldName == null) {
274*9337a630SNickeau                // this is not an input field
275*9337a630SNickeau                if ($field["type"] == "submit") {
276*9337a630SNickeau                    /**
277*9337a630SNickeau                     * This is important to keep the submit element intact
278*9337a630SNickeau                     * for forms integration such as captcha
279*9337a630SNickeau                     * They search the submit button to insert before it
280*9337a630SNickeau                     */
281*9337a630SNickeau                    $classes = "btn btn-primary btn-block";
282*9337a630SNickeau                    if (isset($field["class"])) {
283*9337a630SNickeau                        $field["class"] = $field["class"] . " " . $classes;
284*9337a630SNickeau                    } else {
285*9337a630SNickeau                        $field["class"] = $classes;
286*9337a630SNickeau                    }
287*9337a630SNickeau                    $newFormContent[] = $field;
288*9337a630SNickeau                }
289*9337a630SNickeau                continue;
290*9337a630SNickeau            }
291*9337a630SNickeau            switch ($fieldName) {
292*9337a630SNickeau                case "oldpass":
293*9337a630SNickeau                    $passwordText = $field["_text"];
294*9337a630SNickeau                    $passwordFieldHTML = <<<EOF
295*9337a630SNickeau<div>
296*9337a630SNickeau    <input type="password" class="form-control" placeholder="$passwordText" required="required" name="$fieldName">
297*9337a630SNickeau</div>
298*9337a630SNickeauEOF;
299*9337a630SNickeau                    $newFormContent[] = $passwordFieldHTML;
300*9337a630SNickeau                    break;
301*9337a630SNickeau                case "confirm_delete":
302*9337a630SNickeau                    $confirmText = $field["_text"];
303*9337a630SNickeau                    $ConfirmValue = $field["value"];
304*9337a630SNickeau                    $rememberMeHtml = <<<EOF
305*9337a630SNickeau<div class="checkbox rememberMe">
306*9337a630SNickeau    <label><input type="checkbox" name="$fieldName" value="$ConfirmValue" required="required"> $confirmText</label>
307*9337a630SNickeau</div>
308*9337a630SNickeauEOF;
309*9337a630SNickeau                    $newFormContent[] = $rememberMeHtml;
310*9337a630SNickeau                    break;
311*9337a630SNickeau                default:
312*9337a630SNickeau                    $tag = self::TAG_DELETE;
313*9337a630SNickeau                    LogUtility::msg("The $tag field name ($fieldName) is unknown", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
314*9337a630SNickeau
315*9337a630SNickeau
316*9337a630SNickeau            }
317*9337a630SNickeau        }
318*9337a630SNickeau        $form->_content = $newFormContent;
319*9337a630SNickeau        return true;
320*9337a630SNickeau    }
321*9337a630SNickeau
322*9337a630SNickeau
323*9337a630SNickeau}
324*9337a630SNickeau
325