xref: /template/strap/action/profile.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
19337a630SNickeau<?php
29337a630SNickeau
39337a630SNickeauuse ComboStrap\Bootstrap;
49337a630SNickeauuse ComboStrap\Identity;
59337a630SNickeauuse ComboStrap\LogUtility;
69337a630SNickeauuse ComboStrap\PluginUtility;
79337a630SNickeau
89337a630SNickeauif (!defined('DOKU_INC')) die();
937748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
109337a630SNickeau
119337a630SNickeau/**
129337a630SNickeau *
139337a630SNickeau */
149337a630SNickeauclass action_plugin_combo_profile extends DokuWiki_Action_Plugin
159337a630SNickeau{
169337a630SNickeau
179337a630SNickeau    const CANONICAL = Identity::CANONICAL;
18*4cadd4f8SNickeau    const TAG_UPDATE = "profile-update"; // form 1
19*4cadd4f8SNickeau    const TAG_DELETE = "profile-delete"; // form 2
209337a630SNickeau    const FORM_PROFILE_UPDATE_CLASS = "form-" . self::TAG_UPDATE;
219337a630SNickeau    const FORM_PROFILE_DELETE_CLASS = "form-" . self::TAG_DELETE;
229337a630SNickeau    const CONF_ENABLE_PROFILE_UPDATE_FORM = "enableProfileUpdateForm";
239337a630SNickeau    const CONF_ENABLE_PROFILE_DELETE_FORM = "enableProfileDeleteForm";
249337a630SNickeau
259337a630SNickeau
269337a630SNickeau    function register(Doku_Event_Handler $controller)
279337a630SNickeau    {
289337a630SNickeau        /**
299337a630SNickeau         * To modify the profile update form and add class
309337a630SNickeau         *
319337a630SNickeau         * Deprecated object passed by the event but still in use
329337a630SNickeau         * https://www.dokuwiki.org/devel:event:html_updateprofileform_output
339337a630SNickeau         *
349337a630SNickeau         * Event using the new object but not found anywhere
359337a630SNickeau         * https://www.dokuwiki.org/devel:event:form_updateprofile_output
369337a630SNickeau         */
379337a630SNickeau        if (PluginUtility::getConfValue(self::CONF_ENABLE_PROFILE_UPDATE_FORM, 1)) {
389337a630SNickeau            $controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this, 'handle_profile_update', array());
399337a630SNickeau        }
409337a630SNickeau
419337a630SNickeau        /**
429337a630SNickeau         * To modify the register form and add class
439337a630SNickeau         *
449337a630SNickeau         * Deprecated object passed by the event but still in use
459337a630SNickeau         * https://www.dokuwiki.org/devel:event:html_profiledeleteform_output
469337a630SNickeau         *
479337a630SNickeau         * Event using the new object but not found anywhere
489337a630SNickeau         * https://www.dokuwiki.org/devel:event:form_profiledelete_output
499337a630SNickeau         */
509337a630SNickeau        if (PluginUtility::getConfValue(self::CONF_ENABLE_PROFILE_DELETE_FORM, 1)) {
519337a630SNickeau            $controller->register_hook('HTML_PROFILEDELETEFORM_OUTPUT', 'BEFORE', $this, 'handle_profile_delete', array());
529337a630SNickeau        }
539337a630SNickeau
549337a630SNickeau
559337a630SNickeau    }
569337a630SNickeau
579337a630SNickeau    function handle_profile_update(&$event, $param)
589337a630SNickeau    {
599337a630SNickeau
609337a630SNickeau        /**
619337a630SNickeau         * The profile page is created via buffer
629337a630SNickeau         * We print before the forms to avoid a FOUC
639337a630SNickeau         */
64*4cadd4f8SNickeau        print Identity::getHtmlStyleTag(self::TAG_UPDATE);
659337a630SNickeau
669337a630SNickeau        /**
679337a630SNickeau         * @var Doku_Form $form
689337a630SNickeau         */
699337a630SNickeau        $form = &$event->data;
709337a630SNickeau        $class = &$form->params["class"];
71*4cadd4f8SNickeau        Identity::addIdentityClass($class, self::FORM_PROFILE_UPDATE_CLASS);
729337a630SNickeau        $newFormContent = [];
739337a630SNickeau
749337a630SNickeau        /**
759337a630SNickeau         * Header (Logo / Title)
769337a630SNickeau         */
779337a630SNickeau        $newFormContent[] = Identity::getHeaderHTML($form, self::FORM_PROFILE_UPDATE_CLASS);
789337a630SNickeau
799337a630SNickeau
809337a630SNickeau        /**
819337a630SNickeau         * Form Attributes
829337a630SNickeau         * https://getbootstrap.com/docs/5.0/forms/layout/#horizontal-form
839337a630SNickeau         */
849337a630SNickeau        $rowClass = "row";
859337a630SNickeau        if (Bootstrap::getBootStrapMajorVersion() == Bootstrap::BootStrapFourMajorVersion) {
869337a630SNickeau            $rowClass .= " form-group";
879337a630SNickeau        }
889337a630SNickeau        $firstColWeight = 5;
899337a630SNickeau        $secondColWeight = 12 - $firstColWeight;
909337a630SNickeau
919337a630SNickeau
929337a630SNickeau        /**
939337a630SNickeau         * Replace the field
949337a630SNickeau         *
959337a630SNickeau         * The password text localized by lang is shared
969337a630SNickeau         * between the password and the password check field
979337a630SNickeau         */
989337a630SNickeau        $passwordText = "Password";
999337a630SNickeau        foreach ($form->_content as $field) {
1009337a630SNickeau            if (!is_array($field)) {
1019337a630SNickeau                continue;
1029337a630SNickeau            }
1039337a630SNickeau            $fieldName = $field["name"];
1049337a630SNickeau            if ($fieldName == null) {
1059337a630SNickeau                // this is not an input field
1069337a630SNickeau                switch ($field["type"]) {
1079337a630SNickeau                    case "submit":
1089337a630SNickeau                        /**
1099337a630SNickeau                         * This is important to keep the submit element intact
1109337a630SNickeau                         * for forms integration such as captcha
1119337a630SNickeau                         * The search the submit button to insert before it
1129337a630SNickeau                         */
1139337a630SNickeau                        $classes = "btn btn-primary";
1149337a630SNickeau                        if (isset($field["class"])) {
1159337a630SNickeau                            $field["class"] = $field["class"] . " " . $classes;
1169337a630SNickeau                        } else {
1179337a630SNickeau                            $field["class"] = $classes;
1189337a630SNickeau                        }
1199337a630SNickeau                        $field["tabindex"] = "6";
1209337a630SNickeau                        $newFormContent[] = $field;
1219337a630SNickeau                        break;
1229337a630SNickeau                    case "reset":
1239337a630SNickeau                        $classes = "btn btn-secondary";
1249337a630SNickeau                        if (isset($field["class"])) {
1259337a630SNickeau                            $field["class"] = $field["class"] . " " . $classes;
1269337a630SNickeau                        } else {
1279337a630SNickeau                            $field["class"] = $classes;
1289337a630SNickeau                        }
1299337a630SNickeau                        $field["tabindex"] = "7";
1309337a630SNickeau                        $newFormContent[] = $field;
1319337a630SNickeau                        break;
1329337a630SNickeau                }
1339337a630SNickeau                continue;
1349337a630SNickeau            }
1359337a630SNickeau            switch ($fieldName) {
1369337a630SNickeau                case "login":
1379337a630SNickeau                    $loginText = $field["_text"];
1389337a630SNickeau                    $loginValue = $field["value"];
1399337a630SNickeau                    $loginHTML = <<<EOF
1409337a630SNickeau<div class="$rowClass">
1419337a630SNickeau    <label for="inputUserName" class="col-sm-$firstColWeight col-form-label">$loginText</label>
1429337a630SNickeau    <div class="col-sm-$secondColWeight">
1439337a630SNickeau      <input type="text" class="form-control" id="inputUserName" placeholder="Username" name="$fieldName" value="$loginValue" disabled>
1449337a630SNickeau    </div>
1459337a630SNickeau</div>
1469337a630SNickeauEOF;
1479337a630SNickeau                    $newFormContent[] = $loginHTML;
1489337a630SNickeau                    break;
1499337a630SNickeau                case "fullname":
1509337a630SNickeau                    $fullNameText = $field["_text"];
1519337a630SNickeau                    $fullNameValue = $field["value"];
1529337a630SNickeau                    $fullNameHtml = <<<EOF
1539337a630SNickeau<div class="$rowClass">
1549337a630SNickeau    <label for="inputRealName" class="col-sm-$firstColWeight col-form-label">$fullNameText</label>
1559337a630SNickeau    <div class="col-sm-$secondColWeight">
1569337a630SNickeau      <input type="text" class="form-control" id="inputRealName" placeholder="$fullNameText" tabindex="1" name="$fieldName" value="$fullNameValue" required="required">
1579337a630SNickeau    </div>
1589337a630SNickeau</div>
1599337a630SNickeauEOF;
1609337a630SNickeau                    $newFormContent[] = $fullNameHtml;
1619337a630SNickeau                    break;
1629337a630SNickeau                case "email":
1639337a630SNickeau                    $emailText = $field["_text"];
1649337a630SNickeau                    $emailValue = $field["value"];
1659337a630SNickeau                    $emailHTML = <<<EOF
1669337a630SNickeau<div class="$rowClass">
1679337a630SNickeau    <label for="inputEmail" class="col-sm-$firstColWeight col-form-label">$emailText</label>
1689337a630SNickeau    <div class="col-sm-$secondColWeight">
1699337a630SNickeau      <input type="email" class="form-control" id="inputEmail" placeholder="name@example.com" tabindex="2" name="$fieldName" value="$emailValue" required="required">
1709337a630SNickeau    </div>
1719337a630SNickeau</div>
1729337a630SNickeauEOF;
1739337a630SNickeau                    $newFormContent[] = $emailHTML;
1749337a630SNickeau                    break;
1759337a630SNickeau                case "newpass":
1769337a630SNickeau                    $passwordText = $field["_text"];
1779337a630SNickeau                    $passwordHtml = <<<EOF
1789337a630SNickeau<div class="$rowClass">
1799337a630SNickeau    <label for="inputPassword" class="col-sm-$firstColWeight col-form-label">$passwordText</label>
1809337a630SNickeau    <div class="col-sm-$secondColWeight">
1819337a630SNickeau      <input type="password" class="form-control" id="inputPassword" placeholder="$passwordText" tabindex="3" name="$fieldName">
1829337a630SNickeau    </div>
1839337a630SNickeau</div>
1849337a630SNickeauEOF;
1859337a630SNickeau                    $newFormContent[] = $passwordHtml;
1869337a630SNickeau                    break;
1879337a630SNickeau                case "passchk":
1889337a630SNickeau                    $passwordCheckText = $field["_text"];
1899337a630SNickeau                    $passwordCheckHtml = <<<EOF
1909337a630SNickeau<div class="$rowClass">
1919337a630SNickeau    <label for="inputPasswordCheck" class="col-sm-$firstColWeight col-form-label">$passwordCheckText</label>
1929337a630SNickeau    <div class="col-sm-$secondColWeight">
1939337a630SNickeau      <input type="password" class="form-control" id="inputPasswordCheck" placeholder="$passwordText" tabindex="4" name="$fieldName">
1949337a630SNickeau    </div>
1959337a630SNickeau</div>
1969337a630SNickeauEOF;
1979337a630SNickeau                    $newFormContent[] = $passwordCheckHtml;
1989337a630SNickeau                    break;
1999337a630SNickeau                case "oldpass":
2009337a630SNickeau                    $passwordCheckText = $field["_text"];
2019337a630SNickeau                    $passwordCheckHtml = <<<EOF
2029337a630SNickeau<div class="$rowClass">
2039337a630SNickeau    <label for="inputPasswordCheck" class="col-sm-$firstColWeight col-form-label">$passwordCheckText</label>
2049337a630SNickeau    <div class="col-sm-$secondColWeight">
2059337a630SNickeau      <input type="password" class="form-control" id="inputPasswordCheck" placeholder="$passwordCheckText" tabindex="5" name="$fieldName" required="required">
2069337a630SNickeau    </div>
2079337a630SNickeau</div>
2089337a630SNickeauEOF;
2099337a630SNickeau                    $newFormContent[] = $passwordCheckHtml;
2109337a630SNickeau                    break;
2119337a630SNickeau
2129337a630SNickeau
2139337a630SNickeau                default:
2149337a630SNickeau                    $tag = self::TAG_UPDATE;
2159337a630SNickeau                    LogUtility::msg("The $tag field name ($fieldName) is unknown", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
2169337a630SNickeau
2179337a630SNickeau            }
2189337a630SNickeau        }
2199337a630SNickeau
2209337a630SNickeau
2219337a630SNickeau        /**
2229337a630SNickeau         * Update
2239337a630SNickeau         */
2249337a630SNickeau        $form->_content = $newFormContent;
2259337a630SNickeau        return true;
2269337a630SNickeau
2279337a630SNickeau
2289337a630SNickeau    }
2299337a630SNickeau
230*4cadd4f8SNickeau    public function handle_profile_delete($event, $param)
231*4cadd4f8SNickeau    {
2329337a630SNickeau
2339337a630SNickeau        /**
2349337a630SNickeau         * The profile page is created via buffer
2359337a630SNickeau         * We print before the forms to avoid a FOUC
2369337a630SNickeau         */
237*4cadd4f8SNickeau        print Identity::getHtmlStyleTag(self::TAG_DELETE);
2389337a630SNickeau
2399337a630SNickeau        /**
2409337a630SNickeau         * @var Doku_Form $form
2419337a630SNickeau         */
2429337a630SNickeau        $form = &$event->data;
2439337a630SNickeau        $class = &$form->params["class"];
244*4cadd4f8SNickeau        Identity::addIdentityClass($class, self::FORM_PROFILE_DELETE_CLASS);
2459337a630SNickeau        $newFormContent = [];
2469337a630SNickeau
2479337a630SNickeau        /**
2489337a630SNickeau         * Header (Logo / Title)
2499337a630SNickeau         */
2509337a630SNickeau        $newFormContent[] = Identity::getHeaderHTML($form, self::FORM_PROFILE_DELETE_CLASS, false);
2519337a630SNickeau
2529337a630SNickeau        /**
2539337a630SNickeau         * Field
2549337a630SNickeau         */
2559337a630SNickeau        foreach ($form->_content as $field) {
2569337a630SNickeau            if (!is_array($field)) {
2579337a630SNickeau                continue;
2589337a630SNickeau            }
2599337a630SNickeau            $fieldName = $field["name"];
2609337a630SNickeau            if ($fieldName == null) {
2619337a630SNickeau                // this is not an input field
2629337a630SNickeau                if ($field["type"] == "submit") {
2639337a630SNickeau                    /**
2649337a630SNickeau                     * This is important to keep the submit element intact
2659337a630SNickeau                     * for forms integration such as captcha
2669337a630SNickeau                     * They search the submit button to insert before it
2679337a630SNickeau                     */
2689337a630SNickeau                    $classes = "btn btn-primary btn-block";
2699337a630SNickeau                    if (isset($field["class"])) {
2709337a630SNickeau                        $field["class"] = $field["class"] . " " . $classes;
2719337a630SNickeau                    } else {
2729337a630SNickeau                        $field["class"] = $classes;
2739337a630SNickeau                    }
2749337a630SNickeau                    $newFormContent[] = $field;
2759337a630SNickeau                }
2769337a630SNickeau                continue;
2779337a630SNickeau            }
2789337a630SNickeau            switch ($fieldName) {
2799337a630SNickeau                case "oldpass":
2809337a630SNickeau                    $passwordText = $field["_text"];
2819337a630SNickeau                    $passwordFieldHTML = <<<EOF
2829337a630SNickeau<div>
2839337a630SNickeau    <input type="password" class="form-control" placeholder="$passwordText" required="required" name="$fieldName">
2849337a630SNickeau</div>
2859337a630SNickeauEOF;
2869337a630SNickeau                    $newFormContent[] = $passwordFieldHTML;
2879337a630SNickeau                    break;
2889337a630SNickeau                case "confirm_delete":
2899337a630SNickeau                    $confirmText = $field["_text"];
2909337a630SNickeau                    $ConfirmValue = $field["value"];
2919337a630SNickeau                    $rememberMeHtml = <<<EOF
2929337a630SNickeau<div class="checkbox rememberMe">
2939337a630SNickeau    <label><input type="checkbox" name="$fieldName" value="$ConfirmValue" required="required"> $confirmText</label>
2949337a630SNickeau</div>
2959337a630SNickeauEOF;
2969337a630SNickeau                    $newFormContent[] = $rememberMeHtml;
2979337a630SNickeau                    break;
2989337a630SNickeau                default:
2999337a630SNickeau                    $tag = self::TAG_DELETE;
3009337a630SNickeau                    LogUtility::msg("The $tag field name ($fieldName) is unknown", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
3019337a630SNickeau
3029337a630SNickeau
3039337a630SNickeau            }
3049337a630SNickeau        }
3059337a630SNickeau        $form->_content = $newFormContent;
3069337a630SNickeau        return true;
3079337a630SNickeau    }
3089337a630SNickeau
3099337a630SNickeau
3109337a630SNickeau}
3119337a630SNickeau
312