默认忘记密码表单是Email
表单字段。我有一个附加到每个用户的许可证号码。作为用户,我希望通过输入许可证号而不是电子邮件来获取重置密码链接。
我找到了一种方法来覆盖功能方面而不是表单。我到现在为止做了什么
文件名: _config.php
Object::useCustomClass('MemberLoginForm', 'ExtendLoginForm');
文件名: ExtendLoginForm.php
就像测试一样 - 覆盖forgotPassword
方法
class ExtendLoginForm extends MemberLoginForm
{
public function forgotPassword($data) {
// Ensure password is given
$this->sessionMessage('This works', 'bad');
$this->controller->redirect('Security/lostpassword');
return;
}
}
会话消息已成功打印,并重定向到同一页面。
如何覆盖表单以使其成为Text
字段而非Email
字段。
答案 0 :(得分:9)
首先,只是一个一般提示,你应该避免使用Object :: useCustomClass()来支持Injector(https://docs.silverstripe.org/en/3.0/reference/injector/)。 Object :: useCustomClass()更像是2.4。
忘记密码表单在Security
中生成。您也可以尝试使用该类的自定义实现,并重载ForgotPasswordForm
方法。
config.yml
Injector:
Security:
class: MyCustomSecurity
MyCustomSecurity.php
class MyCustomSecurity extends Security
{
public function LostPasswordForm()
{
$form = parent::LostPasswordForm();
$form->Fields()->replaceField('Email', TextField::create('Email'));
return $form;
}
}