覆盖SilverStripe

时间:2017-03-07 05:34:01

标签: 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;
    }
}

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

如何覆盖表单以使其成为Text字段而非Email字段。

1 个答案:

答案 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;
    }
}