наилучшая практика для размещения данных на контроллере codeigniter с тем же URL? - PullRequest
0 голосов
/ 15 октября 2018

привет, у меня есть два маршрута в codeigniter:

$route['register'] = 'Login/Register';
$route['login'] = 'Login/index';

для отображения формы входа / регистрации

и формы почтовых маршрутов:

$route['loginprocess'] = 'Login/LoginProcess';
$route['registerprocess'] = 'Login/RegisterProcess';

все нормально, нопри использовании class_validation class в

$this->form_validation->set_error_delimiters('<span class="help-block">', '</span>');
        $this->form_validation->set_rules('email', 'Email', 'required|valid_email');
        $this->form_validation->set_rules('pwd', 'Password', 'required');

        if ($this->form_validation->run() == FALSE){
            $this->load->view('login');
        } else {
        validation success
     }

проблема заключается в том, что когда я получаю ошибку при проверке формы, она идет в

http://localhost/logincode/loginprocess

, поэтому она не подходит для URL.он должен публиковаться в том же методе контроллера, где форма уже отображается:

http://localhost/logincode/login

, поэтому есть ли способ публиковать форму в том же URL-адресе.с ошибкой валидации формы

1 Ответ

0 голосов
/ 16 октября 2018

Отправка по тому же URL в CodeIgniter

Вы описали распространенный сценарий.Вы хотите загрузить страницу с формой, выполнить запрос POST, проверить запрос, а затем показать ошибки, если есть проблема.Есть некоторые потенциальные проблемы, о которых следует знать, если вы делаете это:

  1. После успешного сообщения, что произойдет, если браузер выполнит обновление страницы?
  2. После успешного сообщенияЧто произойдет, если пользователь перейдет на другую страницу, но затем вернется в историю?

Обе эти проблемы представляют собой повторяющуюся проблему, и это никогда не желательно.Чтобы решить эту проблему, используйте маркер формы.Токен формы генерируется во время загрузки страницы, где присутствует форма.Значение обычно представляет собой случайную строку символов и помещается в двух местах:

  1. В форме в виде скрытого поля формы.
  2. В сеансе или файле cookie.

Когда форма публикуется, значение токена в скрытом поле формы передается вместе с остальными опубликованными данными.Поскольку существует сеанс или файл cookie, содержащие одно и то же значение, контроллер / метод, который публикуется, может проверить, совпадают ли они, и если они есть, то может быть выполнена проверка, а также вывод сообщений об ошибках или об успехе.В любом случае генерируется новый токен формы, поэтому два сообщения никогда не будут содержать один и тот же токен формы.

Краткое изложение основной концепции

// You of course have to start the 
// session for this to work.
$this->load->library('session');

if( 
    isset( $_POST['token'] ) && 
    isset( $_SESSION['token'] ) && 
    $_POST['token'] == $_SESSION['token'] 
){
    // Do validation ...
    // ...

    // If validation passes
    if( $this->form_validation->run() ){
        $valid = TRUE;
    }

    // If there were validation errors
    else{
        $errors = validation_errors();
    }
}

if( isset( $errors ) )
{
    // Display the errors
}

if( isset( $valid ) )
{
    // Display a thank you message
}

// Always refresh the token
$token = substr(md5(uniqid() . microtime() . rand()), 0, 8);
$_SESSION['token'] = $token;

?>

<form method="POST">
    <input type="text" name="x" />
    <input type="hidden" name="token" value="<?php echo $token; ?>" />
    <input type="submit" value="submit" />
</form>

На практикеэта концепция токенов может быть гораздо более сложной.Например, вы можете выбрать шифрование значений токенов, а затем расшифровывать их при проверке на совпадение.Вы также можете создать массив токенов в своем сеансе / файле cookie и проверить свой опубликованный токен по массиву токенов.У вас могут быть другие идеи о том, как настроить токены форм, но основы были представлены здесь, и я надеюсь, что это поможет вам достичь вашей цели публикации по тому же URL-адресу в CodeIgniter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...