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

Override lost password form in SilverStripe

默认的忘记密码表单是一个 Email 表单域。我有一个许可证号附加到每个用户。作为用户,我想通过输入我的许可证号而不是电子邮件来获取重置密码 link。

我找到了一种方法来覆盖功能方面而不是表单。我到目前为止所做的

文件名:_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 字段。

首先,只是一个一般提示,您应该避免使用 Object::useCustomClass() 而使用 Injector (https://docs.silverstripe.org/en/3.0/reference/injector/)。 Object::useCustomClass() 更像是 2.4 的东西。

忘记密码表单已在 Security 中生成。您也可以尝试使用 class 的自定义实现,并重载 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;
    }
}