在SilverStripe中覆盖丢失的密码表单

在SilverStripe中覆盖丢失的密码表单,silverstripe,Silverstripe,默认忘记密码表单是电子邮件表单字段。我有一个许可证号码附加到每个用户。作为一名用户,我希望通过输入我的许可证号码而不是电子邮件来获得重置密码链接 我已经找到了一种方法来覆盖功能方面,而不是表单。我现在所做的一切 文件名:_config.php 对象::useCustomClass('MemberLoginForm','ExtendLoginForm') 文件名:ExtendLoginForm.php 就像测试-覆盖放弃密码方法一样 class ExtendLoginForm extends Me

默认忘记密码表单是
电子邮件
表单字段。我有一个许可证号码附加到每个用户。作为一名用户,我希望通过输入我的许可证号码而不是电子邮件来获得重置密码链接

我已经找到了一种方法来覆盖功能方面,而不是表单。我现在所做的一切

文件名:_config.php

对象::useCustomClass('MemberLoginForm','ExtendLoginForm')

文件名:ExtendLoginForm.php

就像测试-覆盖
放弃密码
方法一样

class ExtendLoginForm extends MemberLoginForm
{

    public function forgotPassword($data) {
        // Ensure password is given

        $this->sessionMessage('This works', 'bad');

        $this->controller->redirect('Security/lostpassword');
        return;
    }
}
会话消息已成功打印,并重定向到同一页


如何重写表单,使其成为
文本
字段,而不是
电子邮件
字段。

首先,只是一个一般提示,您应该避免使用Object::useCustomClass()而使用Injector()。Object::useCustomClass()更像是一个2.4版本的东西

忘记密码表单在
安全
中生成。您也可以尝试使用该类的自定义实现,并重载
ForgotPasswordForm
方法

config.yml

MyCustomSecurity.php


为了区别起见,可以将TextField::create('licenseNumber')改为TextField::create('Email')。除非您想重载另一个方法,否则必须将字段命名为'Email'。不过,您可以更改标签。TextField::create('Email','License number');
Injector:
  Security:
    class: MyCustomSecurity
class MyCustomSecurity extends Security
{
    public function LostPasswordForm()
    {
        $form = parent::LostPasswordForm();
        $form->Fields()->replaceField('Email', TextField::create('Email'));

        return $form;
    }
}