覆盖SilverStripe中丢失的密码表单

Abs*_*act 2 silverstripe

默认忘记密码表单是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

会话消息已成功打印,并重定向到同一页面.

如何覆盖表单以使其成为Text字段而不是Email字段.

Unc*_*ese 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
Run Code Online (Sandbox Code Playgroud)

MyCustomSecurity.php

class MyCustomSecurity extends Security
{
    public function LostPasswordForm()
    {
        $form = parent::LostPasswordForm();
        $form->Fields()->replaceField('Email', TextField::create('Email'));

        return $form;
    }
}
Run Code Online (Sandbox Code Playgroud)