在自定义控制器中使用表单?
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);
}
}
我已经创建了一个 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);
}
}