用户注册页面自定义密码功能!!!!

插件开发及发布

版主: woniou

回复
头像
赵胡胡
帖子: 23
注册时间: 2014年 1月 11日 20:14
联系:

用户注册页面自定义密码功能!!!!

帖子 赵胡胡 »

默认的注册页面只有用户名 邮箱,密码是系统生成的,进入后台弹出提示注册者。
。。。。。。。这也太扯了。

怎么实现在注册页面就让用户填写密码。。。

看了一下注册相关源码。。好像密码项目也是预设了的,不知道怎么弄。。
头像
ClayMore
帖子: 2481
注册时间: 2007年 11月 29日 02:55
来自: Sleeping Forest
联系:

Re: 用户注册页面自定义密码功能!!!!

帖子 ClayMore »

有编码能力可以自己弄 没的话只能找外援
头像
赵胡胡
帖子: 23
注册时间: 2014年 1月 11日 20:14
联系:

Re: 用户注册页面自定义密码功能!!!!

帖子 赵胡胡 »

ClayMore 写了:有编码能力可以自己弄 没的话只能找外援


外援。。。。。也没有!
头像
ClayMore
帖子: 2481
注册时间: 2007年 11月 29日 02:55
来自: Sleeping Forest
联系:

Re: 用户注册页面自定义密码功能!!!!

帖子 ClayMore »

猪八戒下单有偿 大把的外援
arrayJY
帖子: 1
注册时间: 2018年 2月 1日 21:29

Re: 用户注册页面自定义密码功能!!!!

帖子 arrayJY »

我的方法是修改内核,= =虽然一般不建议这样做,所以还是先做好备份为好(不会写插件不要吐槽...

------------------分析部分(如果不想看就直接跳到动手部分)--------------------
首先我们找到/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 = Typecho_Common::randString(7);

randString?是不是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则设置,否则还是按照原来的样子使用随机字符串。


------------------动手部分--------------------
打开注册页面,从地址栏里就可以看得到我们的注册文件位于/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>

照猫画虎,在27行之后添加:

代码: 全选

<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 = array(
    '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 = Typecho_Common::randString(7);

把它改成:

代码: 全选

/** 如果请求中含有password则设置为密码,否则随机密码 */
if (array_key_exists('password', $_REQUEST)) {
    $generatedPassword = $this->request->password;
}
else
{
    $generatedPassword = Typecho_Common::randString(7);
}


至此所有工作就已经完成了,我们就可以在注册页面自定义密码了。
回复