Using a form in a custom controller?

岁酱吖の 提交于 2019-12-11 23:57:44

问题


I have created a Register_Controller and have setup a route for it as per below. The RegisterForm renders fine but when you click 'Register' it goes to the following URL: http://website.com/Register_Controller/RegisterForm and displays 'Page not found' and thus is not hitting the doRegister method.

What am I doing wrong?

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

回答1:


Your form is trying to get a base link from the controller, but since it cannot find one on custom route controller, it uses controller name. You need to add Link() method.

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


来源:https://stackoverflow.com/questions/36232001/using-a-form-in-a-custom-controller

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!