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