Проверка формы Codeigniter Обратный вызов, проверяющий несколько полей - PullRequest
5 голосов
/ 20 августа 2010

У меня установлен этот контроллер для входа в систему:

<?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;
        }


    }

}

Я смотрю на строку, которая выполняет обратный вызов проверки формы >> $this->form_validation->set_rules(array('username','password'), 'Username', 'callback_terminal_login_check[$username,$password]');

Я знаю, что это неправильно. По сути, я хочу проверить имя пользователя и пароль в соответствии с моделью Authentication-> 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();?>

Ответы [ 3 ]

9 голосов
/ 20 августа 2010

Используйте это в вашем контроллере для установки правил проверки.

$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: Добавлено обязательное поле в правило проверки пароля, чтобы вам не приходилось обращаться к БДесли кто-то не добавляет пароль.

9 голосов
/ 20 августа 2010

Насколько я понимаю, валидация форм работает на основе полей.Чтобы добиться того, что вы хотите, я бы прикрепил обратный вызов к одному из полей (вероятно, поле пароля было бы лучше), а затем получил бы доступ к другим данным поля формы, используя глобальный массив POST.Таким образом, вам не нужно ничего передавать функции обратного вызова в качестве параметров.

2 голосов
/ 21 августа 2010

Я предпочитаю использовать проверку формы для простой проверки ввода, такой как проверка пустых полей, недействительных адресов электронной почты, слишком коротких паролей и т. Д. Я склонен не использовать проверку формы для более сложной логики, такой как аутентификация.Я бы поставил проверку аутентификации в методе action, а не в функции обратного вызова проверки.Если бы вы обошли эту проблему, обойдя ее стороной.

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; ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...