xref: /template/strap/action/registration.php (revision 9337a630db122fdba0294f47d72bdf5433c2bf10)
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();
17a6bf47aaSNickeaurequire_once(__DIR__ . '/../class/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         */
91*9337a630SNickeau        print Snippet::createCssSnippet("register")
92*9337a630SNickeau            ->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