我已将此控制器设置为登录:
<?php
class Login extends Controller {
function __construct() {
parent::Controller();
$this->form_validation->set_error_delimiters('', '');
$this->output->enable_profiler(TRUE);
}
function index(){
redirect('/login/terminal');
}
function terminal() {
// terminal login
$this->form_validation->set_rules(array('username','password'), 'Username', 'callback_terminal_login_check[$username,$password]');
if ($this->form_validation->run() == FALSE) {
$this->load->view('login_header');
$this->load->view('login_terminal');
$data['version'] = $this->master->GetVersion();
$this->load->view('login_footer', $data);
} else {
redirect('/terminal');
}
}
function terminal_login_check($username,$password) {
// callback function to perform terminal login
if ($this->authentication->DoTerminalAuthentication($username,$password)) {
echo $username;
return TRUE;
} else {
$this->form_validation->set_message('terminal_login_check', 'Invalid');
return FALSE;
}
}
}
我所看到的是执行表单验证回调的行&gt;&gt; $this->form_validation->set_rules(array('username','password'), 'Username', 'callback_terminal_login_check[$username,$password]');
我知道这不对。基本上我想要做的是检查Authentication-&gt; DoTerminalAuthentication模型的用户名和密码来处理用户的登录。我想传递$username
和$password
表单字段。如果有帮助,这是我的表单视图:
<div id="title">Terminal Login</div>
<?php
if (validation_errors()) {
echo '<div id="error">' . validation_errors() . '</div>';
}
?>
<?=form_open('login/terminal');?>
<?=form_label('Username', 'username')?><br />
<?=form_input(array('id'=>'username','name'=>'username','value'=>set_value('username')))?><br />
<?=form_label('Password', 'password')?><br />
<?=form_password(array('id'=>'password','name'=>'password'))?><br />
<?=form_submit(array('name'=>'passwordsubmit','value'=>'Login >>'))?><br />
<?=form_close();?>
答案 0 :(得分:9)
据我了解,表单验证在逐个字段的基础上进行。为了达到你想要的效果,我会将回调附加到其中一个字段(可能是密码字段最好),然后使用全局POST数组访问其他表单字段数据。这样您就不需要将任何内容作为参数传递给回调函数。
答案 1 :(得分:9)
在控制器中使用此功能来设置验证规则。
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required|callback_terminal_login_check');
回调就是这样的。如果您要将您的帖子数据与数据库进行比较,我会使用模型。
function terminal_login_check()
{
$username = $this->input->post('username');
$password = $this->input->post('password');
// LOAD MODEL HERE
if ($this->authentication->DoTerminalAuthentication($username, $password))
{
echo $username;
return TRUE;
}
else
{
$this->form_validation->set_message('terminal_login_check', 'Invalid');
return FALSE;
}
}
编辑2013-07-09:为密码验证规则添加了必填字段,这样如果有人不添加密码,您就不必点击数据库。
答案 2 :(得分:2)
我更喜欢使用表单验证来进行简单的输入验证,例如检查空字段,无效的电子邮件地址,太短的密码等。我倾向于不使用表单验证来处理更复杂的逻辑,例如身份验证。我将身份验证检查放在操作方法中而不是验证回调函数中。通过侧面踩它会超越你的特定问题。
function terminal()
{
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'password', 'required');
if ($this->form_validation->run())
{
$username = $this->input->post('username');
$password = $this->input->post('password');
if ($this->authentication->DoTerminalAuthentication($username, $password))
{
// Handle successful login
}
else
{
// Authentication failed. Alert the view.
$this->load->view('terminal', array('login_failed' => true));
}
}
else
{
$this->load->view('terminal', array('login_failed' => false));
}
}
然后在视图中,您可以将其放在登录表单下方
<?php if ($login_failed) : ?>
<span id="login-failed-message">Login failed</span>
<?php endif; ?>