在自定义控制器中使用表单?

Using a form in a custom controller?

我已经创建了一个 Register_Controller 并设置了一个 route,如下所示。 RegisterForm 呈现良好,但当您单击 'Register' 时,它会转到以下 URL:http://website.com/Register_Controller/RegisterForm 并显示 'Page not found',因此不会点击 doRegister 方法。

我做错了什么?

Routes.yml

---
Name: mysiteroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'register': 'Register_Controller'

Register_Controller.php

<?php


class Register_Controller extends Page_Controller {
    private static $allowed_actions = array(
        'RegisterForm'
    );

    public function index() {
        return $this->renderWith(array('RegisterPage', 'Page'));
    }

    public function RegisterForm(){
        return new RegisterForm($this, 'RegisterForm');
    }
}

RegisterForm.php

<?php

class RegisterForm extends Form {
    public function __construct($controller, $name) {
        $fields = new FieldList(
            TextField::create('FirstName'),
            TextField::create('Surname'),
            TextField::create('Email'),
            PasswordField::create('Password'),
            PasswordField::create('ConfirmPassword'),
            TextField::create('Username')

        );

        $actions = new FieldList(
            new FormAction('doRegister', 'Register')
        );

        $validator = new RequiredFields(
            'Email', 'Password', 'ConfirmPassword', 'Username'
        );

        parent::__construct($controller, $name, $fields, $actions, $validator);

        $this->disableSecurityToken();

        if (Session::get('RegisterFormData')) {
            $this->loadDataFrom(Session::get('RegisterFormData'));
        }
    }

    public function doRegister($data, $form) {

        $checkIfEmailExsists = Member::get()->filter('Email', $data['Email'])->first();
        $registerFormData = Session::set('RegisterFormData', $data);

        if ($checkIfEmailExsists) {
            $form->addErrorMessage('Email', 'This email already exists', 'bad');
            return $this->controller->redirectBack();
        }

        $member = new Member();
        $form->saveInto($member);
        $password = $data['Password'];
        $member->changePassword($password);
        $member->write();
        $member->addToGroupByCode('administrators', 'Administrators');
        $member->logIn();
        Session::clear('RegisterFormData');
        return $this->controller->redirect($this->controller->Link('thanks'));
    }
}

RegisterPage.ss

<h2>Register Here</h2>

$RegisterForm

您的表单正试图从控制器中获取一个基础 link,但由于它无法在自定义路由控制器上找到基础,因此它使用了控制器名称。您需要添加 Link() 方法。

class Register_Controller extends Page_Controller {
    public function Link($action = null) {
        return Controller::join_links(Director::baseURL(), '/register/', $action);
    }
}