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