1a6bf47aaSNickeau<?php 2a6bf47aaSNickeau/** 3a6bf47aaSNickeau * Action Component 4a6bf47aaSNickeau * Add a button in the edit toolbar 5a6bf47aaSNickeau * 6a6bf47aaSNickeau * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 7a6bf47aaSNickeau * @author Nicolas GERARD 8a6bf47aaSNickeau */ 9a6bf47aaSNickeau 10a6bf47aaSNickeauuse ComboStrap\Bootstrap; 11a6bf47aaSNickeauuse ComboStrap\Identity; 12a6bf47aaSNickeauuse ComboStrap\LogUtility; 13a6bf47aaSNickeauuse ComboStrap\Snippet; 14a6bf47aaSNickeauuse dokuwiki\Menu\Item\Register; 15a6bf47aaSNickeau 16a6bf47aaSNickeauif (!defined('DOKU_INC')) die(); 17*37748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 18a6bf47aaSNickeau 19a6bf47aaSNickeau/** 20a6bf47aaSNickeau * 21a6bf47aaSNickeau * Register forms depend on the following configuration 22a6bf47aaSNickeau * https://www.dokuwiki.org/config:autopasswd 23a6bf47aaSNickeau * If true, there is no password field 24a6bf47aaSNickeau */ 25a6bf47aaSNickeauclass action_plugin_combo_registration extends DokuWiki_Action_Plugin 26a6bf47aaSNickeau{ 27a6bf47aaSNickeau 28a6bf47aaSNickeau const CANONICAL = Identity::CANONICAL; 29a6bf47aaSNickeau const TAG = "register"; 30a6bf47aaSNickeau const FORM_REGISTER_CLASS = "form-".self::TAG; 31a6bf47aaSNickeau const CONF_ENABLE_REGISTER_FORM = "enableRegistrationForm"; 32a6bf47aaSNickeau 33a6bf47aaSNickeau 34a6bf47aaSNickeau /** 35a6bf47aaSNickeau * Return the register text and link paragraph 36a6bf47aaSNickeau * @return string 37a6bf47aaSNickeau */ 38a6bf47aaSNickeau public static function getRegisterLinkAndParagraph() 39a6bf47aaSNickeau { 40a6bf47aaSNickeau 41a6bf47aaSNickeau 42a6bf47aaSNickeau $registerHtml = ""; 43a6bf47aaSNickeau if (actionOK('register')) { 44a6bf47aaSNickeau 45a6bf47aaSNickeau /** 46a6bf47aaSNickeau * The register class does not allow 47a6bf47aaSNickeau * registration if your are logged in (What ?) 48a6bf47aaSNickeau * and send an exception 49a6bf47aaSNickeau */ 50a6bf47aaSNickeau if (!Identity::isLoggedIn()) { 51a6bf47aaSNickeau $registerLink = (new Register())->asHtmlLink('', false); 52a6bf47aaSNickeau global $lang; 53a6bf47aaSNickeau $tag = self::TAG; 54a6bf47aaSNickeau $registerText = $lang['reghere']; 55a6bf47aaSNickeau $registerHtml = <<<EOF 56a6bf47aaSNickeau<p class="$tag">$registerText : $registerLink</p> 57a6bf47aaSNickeauEOF; 58a6bf47aaSNickeau } 59a6bf47aaSNickeau } 60a6bf47aaSNickeau return $registerHtml; 61a6bf47aaSNickeau } 62a6bf47aaSNickeau 63a6bf47aaSNickeau 64a6bf47aaSNickeau function register(Doku_Event_Handler $controller) 65a6bf47aaSNickeau { 66a6bf47aaSNickeau /** 67a6bf47aaSNickeau * To modify the register form and add class 68a6bf47aaSNickeau * 69a6bf47aaSNickeau * Deprecated object passed by the event but still in use 70a6bf47aaSNickeau * https://www.dokuwiki.org/devel:event:html_registerform_output 71a6bf47aaSNickeau */ 72a6bf47aaSNickeau $controller->register_hook('HTML_REGISTERFORM_OUTPUT', 'BEFORE', $this, 'handle_register_page', array()); 73a6bf47aaSNickeau 74a6bf47aaSNickeau /** 75a6bf47aaSNickeau * Event using the new object but not yet used 76a6bf47aaSNickeau * https://www.dokuwiki.org/devel:event:form_register_output 77a6bf47aaSNickeau */ 78a6bf47aaSNickeau // $controller->register_hook('FORM_REGISTER_OUTPUT', 'BEFORE', $this, 'handle_register', array()); 79a6bf47aaSNickeau 80a6bf47aaSNickeau 81a6bf47aaSNickeau } 82a6bf47aaSNickeau 83a6bf47aaSNickeau function handle_register_page(&$event, $param) 84a6bf47aaSNickeau { 85a6bf47aaSNickeau 86a6bf47aaSNickeau /** 87a6bf47aaSNickeau * The register page is created via buffer 88a6bf47aaSNickeau * We print before the forms 89a6bf47aaSNickeau * to avoid a FOUC 90a6bf47aaSNickeau */ 919337a630SNickeau print Snippet::createCssSnippet("register") 929337a630SNickeau ->getHtmlStyleTag(); 93a6bf47aaSNickeau 94a6bf47aaSNickeau 95a6bf47aaSNickeau /** 96a6bf47aaSNickeau * @var Doku_Form $form 97a6bf47aaSNickeau */ 98a6bf47aaSNickeau $form = &$event->data; 99a6bf47aaSNickeau $class = &$form->params["class"]; 100a6bf47aaSNickeau if (isset($class)) { 101a6bf47aaSNickeau $class = $class . " " . self::FORM_REGISTER_CLASS; 102a6bf47aaSNickeau } else { 103a6bf47aaSNickeau $class = self::FORM_REGISTER_CLASS; 104a6bf47aaSNickeau } 105a6bf47aaSNickeau $newFormContent = []; 106a6bf47aaSNickeau 107a6bf47aaSNickeau /** 108a6bf47aaSNickeau * Header (Logo / Title) 109a6bf47aaSNickeau */ 110a6bf47aaSNickeau $newFormContent[] = Identity::getHeaderHTML($form, self::FORM_REGISTER_CLASS); 111a6bf47aaSNickeau 112a6bf47aaSNickeau 113a6bf47aaSNickeau /** 114a6bf47aaSNickeau * Form Attributes 115a6bf47aaSNickeau * https://getbootstrap.com/docs/5.0/forms/layout/#horizontal-form 116a6bf47aaSNickeau */ 117a6bf47aaSNickeau $rowClass = "row"; 118a6bf47aaSNickeau if (Bootstrap::getBootStrapMajorVersion() == Bootstrap::BootStrapFourMajorVersion) { 119a6bf47aaSNickeau $rowClass .= " form-group"; 120a6bf47aaSNickeau } 121a6bf47aaSNickeau $firstColWeight = 5; 122a6bf47aaSNickeau $secondColWeight = 12 - $firstColWeight; 123a6bf47aaSNickeau 124a6bf47aaSNickeau 125a6bf47aaSNickeau /** 126a6bf47aaSNickeau * Replace the field 127a6bf47aaSNickeau * 128a6bf47aaSNickeau * The password text localized by lang is shared 129a6bf47aaSNickeau * between the password and the password check field 130a6bf47aaSNickeau */ 131a6bf47aaSNickeau $passwordText = "Password"; 132a6bf47aaSNickeau foreach ($form->_content as $pos => $field) { 133a6bf47aaSNickeau if (!is_array($field)) { 134a6bf47aaSNickeau continue; 135a6bf47aaSNickeau } 136a6bf47aaSNickeau $fieldName = $field["name"]; 137a6bf47aaSNickeau if ($fieldName == null) { 138a6bf47aaSNickeau // this is not an input field 139a6bf47aaSNickeau if ($field["type"] == "submit") { 140a6bf47aaSNickeau /** 141a6bf47aaSNickeau * This is important to keep the submit element intact 142a6bf47aaSNickeau * for forms integration such as captcha 143a6bf47aaSNickeau * The search the submit button to insert before it 144a6bf47aaSNickeau */ 145a6bf47aaSNickeau $classes = "btn btn-primary"; 146a6bf47aaSNickeau if (isset($field["class"])) { 147a6bf47aaSNickeau $field["class"] = $field["class"] . " " . $classes; 148a6bf47aaSNickeau } else { 149a6bf47aaSNickeau $field["class"] = $classes; 150a6bf47aaSNickeau } 151a6bf47aaSNickeau $field["tabindex"] = "6"; 152a6bf47aaSNickeau $newFormContent[] = $field; 153a6bf47aaSNickeau } 154a6bf47aaSNickeau continue; 155a6bf47aaSNickeau } 156a6bf47aaSNickeau switch ($fieldName) { 157a6bf47aaSNickeau case "login": 158a6bf47aaSNickeau $loginText = $field["_text"]; 159a6bf47aaSNickeau $loginValue = $field["value"]; 160a6bf47aaSNickeau $loginHTML = <<<EOF 161a6bf47aaSNickeau<div class="$rowClass"> 162a6bf47aaSNickeau <label for="inputUserName" class="col-sm-$firstColWeight col-form-label">$loginText</label> 163a6bf47aaSNickeau <div class="col-sm-$secondColWeight"> 164a6bf47aaSNickeau <input type="text" class="form-control" id="inputUserName" placeholder="Username" tabindex="1" name="login" value="$loginValue" required="required"> 165a6bf47aaSNickeau </div> 166a6bf47aaSNickeau</div> 167a6bf47aaSNickeauEOF; 168a6bf47aaSNickeau $newFormContent[] = $loginHTML; 169a6bf47aaSNickeau break; 170a6bf47aaSNickeau case "pass": 171a6bf47aaSNickeau $passwordText = $field["_text"]; 172a6bf47aaSNickeau $passwordHtml = <<<EOF 173a6bf47aaSNickeau<div class="$rowClass"> 174a6bf47aaSNickeau <label for="inputPassword" class="col-sm-$firstColWeight col-form-label">$passwordText</label> 175a6bf47aaSNickeau <div class="col-sm-$secondColWeight"> 176a6bf47aaSNickeau <input type="password" class="form-control" id="inputPassword" placeholder="$passwordText" tabindex="2" name="pass" required="required"> 177a6bf47aaSNickeau </div> 178a6bf47aaSNickeau</div> 179a6bf47aaSNickeauEOF; 180a6bf47aaSNickeau $newFormContent[] = $passwordHtml; 181a6bf47aaSNickeau break; 182a6bf47aaSNickeau case "passchk": 183a6bf47aaSNickeau $passwordCheckText = $field["_text"]; 184a6bf47aaSNickeau $passwordCheckHtml = <<<EOF 185a6bf47aaSNickeau<div class="$rowClass"> 186a6bf47aaSNickeau <label for="inputPasswordCheck" class="col-sm-$firstColWeight col-form-label">$passwordCheckText</label> 187a6bf47aaSNickeau <div class="col-sm-$secondColWeight"> 188a6bf47aaSNickeau <input type="password" class="form-control" id="inputPasswordCheck" placeholder="$passwordText" tabindex="3" name="passchk" required="required"> 189a6bf47aaSNickeau </div> 190a6bf47aaSNickeau</div> 191a6bf47aaSNickeauEOF; 192a6bf47aaSNickeau $newFormContent[] = $passwordCheckHtml; 193a6bf47aaSNickeau break; 194a6bf47aaSNickeau case "fullname": 195a6bf47aaSNickeau $fullNameText = $field["_text"]; 196a6bf47aaSNickeau $fullNameValue = $field["value"]; 197a6bf47aaSNickeau $fullNameHtml = <<<EOF 198a6bf47aaSNickeau<div class="$rowClass"> 199a6bf47aaSNickeau <label for="inputRealName" class="col-sm-$firstColWeight col-form-label">$fullNameText</label> 200a6bf47aaSNickeau <div class="col-sm-$secondColWeight"> 201a6bf47aaSNickeau <input type="text" class="form-control" id="inputRealName" placeholder="$fullNameText" tabindex="4" name="fullname" value="$fullNameValue" required="required"> 202a6bf47aaSNickeau </div> 203a6bf47aaSNickeau</div> 204a6bf47aaSNickeauEOF; 205a6bf47aaSNickeau $newFormContent[] = $fullNameHtml; 206a6bf47aaSNickeau break; 207a6bf47aaSNickeau case "email": 208a6bf47aaSNickeau $emailText = $field["_text"]; 209a6bf47aaSNickeau $emailValue = $field["value"]; 210a6bf47aaSNickeau $emailHTML = <<<EOF 211a6bf47aaSNickeau<div class="$rowClass"> 212a6bf47aaSNickeau <label for="inputEmail" class="col-sm-$firstColWeight col-form-label">$emailText</label> 213a6bf47aaSNickeau <div class="col-sm-$secondColWeight"> 214a6bf47aaSNickeau <input type="email" class="form-control" id="inputEmail" placeholder="name@example.com" tabindex="5" name="email" value="$emailValue" required="required"> 215a6bf47aaSNickeau </div> 216a6bf47aaSNickeau</div> 217a6bf47aaSNickeauEOF; 218a6bf47aaSNickeau $newFormContent[] = $emailHTML; 219a6bf47aaSNickeau break; 220a6bf47aaSNickeau default: 221a6bf47aaSNickeau $tag = self::TAG; 222a6bf47aaSNickeau LogUtility::msg("The $tag field name ($fieldName) is unknown", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 223a6bf47aaSNickeau 224a6bf47aaSNickeau } 225a6bf47aaSNickeau } 226a6bf47aaSNickeau 227a6bf47aaSNickeau 228a6bf47aaSNickeau /** 229a6bf47aaSNickeau * Link in the form footer to login and resend 230a6bf47aaSNickeau */ 231a6bf47aaSNickeau $loginLinkToHtmlForm = action_plugin_combo_login::getLoginParagraphWithLinkToFormPage(); 232a6bf47aaSNickeau if (!empty($loginHTML)) { 233a6bf47aaSNickeau $newFormContent[] = $loginLinkToHtmlForm; 234a6bf47aaSNickeau } 235a6bf47aaSNickeau $resendHtml = action_plugin_combo_resend::getResendPasswordParagraphWithLinkToFormPage(); 236a6bf47aaSNickeau if (!empty($resendHtml)) { 237a6bf47aaSNickeau $newFormContent[] = $resendHtml; 238a6bf47aaSNickeau } 239a6bf47aaSNickeau 240a6bf47aaSNickeau /** 241a6bf47aaSNickeau * Update 242a6bf47aaSNickeau */ 243a6bf47aaSNickeau $form->_content = $newFormContent; 244a6bf47aaSNickeau return true; 245a6bf47aaSNickeau 246a6bf47aaSNickeau 247a6bf47aaSNickeau } 248a6bf47aaSNickeau 249a6bf47aaSNickeau 250a6bf47aaSNickeau} 251a6bf47aaSNickeau 252