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