Loading... 从WordPress转到typecho之后,可以发现它们的的一个差别,那就是新用户注册。 在WordPress中,用户注册甚至需要邮箱的验证。而typecho只用输入用户名和邮箱就可以完成注册,注册完成后给出默认密码并让用户登录后修改。 注册的时候不需要发送邮箱验证码,也算是一个方便用户注册,更容易涨用户的操作。但是不默认输入密码,这个就给用户带来麻烦了。 ---------- [x-title]可行性分析[/x-title] 经过检查,在/var/Widget/Register.php这个文件的41-47行。 ``` /** 如果请求中有password */ if (array_key_exists('password', $_REQUEST)) { $validator->addRule('password', 'required', _t('必须填写密码')); $validator->addRule('password', 'minLength', _t('为了保证账户安全, 请输入至少六位的密码'), 6); $validator->addRule('password', 'maxLength', _t('为了便于记忆, 密码长度请不要超过十八位'), 18); $validator->addRule('confirm', 'confirm', _t('两次输入的密码不一致'), 'password'); } ``` 说明路由里面本来就有关于密码的请求处理。不需要我们从零开始构建。 继续往下我们可以看到: `$generatedPassword = Common::randString(7);` 其中的“Random String”,即随机字符串。可参考:/var/Typecho/Common.php。 本文文末: `$this->widget('Widget_Notice')->set(_t('用户 <strong>%s</strong> 已经成功注册, 密码为 <strong>%s</strong>', $this->screenName, $generatedPassword), 'success');` 该字符串是注册成功后上方弹出的文字框里的内容。由此可以推断出:$generatedPassword即为密码 #### 那么我们现在要做的事情就有两个: 1.修改注册时的表单,使它发送的请求中带有password。 2.接收请求时,如果请求中有password则设置,否则还是按照原来的样子使用随机字符串。 [x-title]理论实践[/x-title] 打开注册页面,从地址栏里就可以看得到我们的注册文件位于/admin/register.php。 看到20-27行: ``` <p> <label for="name" class="sr-only"><?php _e('用户名'); ?></label> <input type="text" id="name" name="name" placeholder="<?php _e('用户名'); ?>" value="<?php echo $rememberName; ?>" class="text-l w-100" autofocus /> </p> <p> <label for="mail" class="sr-only"><?php _e('Email'); ?></label> <input type="email" id="mail" name="mail" placeholder="<?php _e('Email'); ?>" value="<?php echo $rememberMail; ?>" class="text-l w-100" /> </p> ``` 画个瓢,在后面加上: ``` <p> <label for="password" class="sr-only"><?php _e('密码'); ?></label> <input type="password" id="password" name="password" placeholder="<?php _e('密码'); ?>" value="<?php echo $rememberPassword; ?>" class="text-l w-100" autofocus /> </p> <p> <label for="confirm" class="sr-only"><?php _e('重复密码'); ?></label> <input type="password" id="confirm" name="confirm" placeholder="<?php _e('重复密码'); ?>" value="<?php echo $rememberConfirm; ?>" class="text-l w-100" /> </p> ``` 根据路由信息,我们需要发送password和confirm的两个请求内容。 这样我们的表单部分就修改完了,刷新页面可以看到多了两个文本框。 之后再来到/var/Widget/Register.php,找到有这么一段代码: ``` $dataStruct = [ 'name' => $this->request->name, 'mail' => $this->request->mail, 'screenName'=> $this->request->name, 'password' => $hasher->HashPassword($generatedPassword), 'created' => $this->options->time, 'group' => 'subscriber' ]; ``` 这里真的要夸一下Typecho的代码可读性了,不难看出可以通过$this->request->请求名称 来获取请求内容。 那么我们找到刚才的: `$generatedPassword = Common::randString(7);` 把它改成: ``` /** 如果请求中含有password则设置为密码,否则随机密码 */ if (array_key_exists('password', $_REQUEST)) { $generatedPassword = $this->request->password; } else { $generatedPassword = Typecho_Common::randString(7); } ``` 至此所有工作就已经完成了,我们就可以在注册页面自定义密码了。 不过这个修改只针对typecho的默认主题,因为极大多数主题都是另外引用注册功能的。假如我们使用了别的主题,我们还需要在修改一下主题。让它在注册页面自定义密码。 最后修改:2024 年 01 月 17 日 © 允许规范转载 赞 1 如果觉得我的文章对你有用,请随意赞赏