2017-02-27 76 views

回答

1

这里是我想出了

的解决方案,我把那些钩子在我的网站/的init.php文件

// change login name input label to e-mail-address 
$wire->addHookAfter('ProcessLogin::buildLoginForm', function(HookEvent $event) { 
    // on liner as we don't change anything else 
    $event->return->get('login_name')->set('label', $event->_('E-Mail-Address')); 
}); 

// hook into session::login to get user by mail 
$wire->addHookBefore('Session::login', function(HookEvent $event) { 
    // need to get email from $input as processLogin::execute is pageName sanitizing 
    $email = $event->input->post->email('login_name'); 
    // stop here if login_name not a valid email 
    if (!$email) return; 
    // new selector arrays don't seem to work on $user so using $pages here 
    $user = $event->pages->get([['email', $email]]); 
    // if valid user set login name argument 
    if ($user->id) $event->setArgument('name', $user->name); 
}); 

裸记住,电子邮件是不是唯一的领域,所以如果你不保证电子邮件地址的唯一性,这将无法正常工作,你可以稍微改变它,以克服这一点,虽然..

看看https://processwire.com/talk/topic/1838-login-using-e-mail-rather-than-username-and-general-login-issues/在哪里瑞安公布一些更多的信息和可能的解决方案重复的电子邮件地址为 和https://processwire.com/talk/topic/1716-integrating-a-member-visitor-login-form/有关前端登录策略的更多信息

+0

请谨慎使用$ email作为选择器,而不必先对其进行消毒。 此外,这是我的这个版本:https://processwire.com/talk/topic/1716-integrating-a-member-visitor-login-form/?page=4#comment-89616其中检查输入的名称实际上是处理挂钩之前的电子邮件地址。 – adrian

+0

'$ email = $ event-> input-> post-> email('login_name');'是电子邮件清理值?混合WireInput和消毒剂 – Can

相关问题