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