Проблема в том, что вы используете две отдельные функции для обработки формы. Документы класса проверки формы не очень хорошо объясняют это, и мне потребовалось некоторое время, чтобы понять это, но form_validation-> run () возвращает false, если есть ошибка, но также, если это запрос GET, и впоследствии учитывает запрос GET в связанных функциях, таких как form_error () и validation_errors (), set_value () и т. д.
Лучшая практика в КИ (и в целом) заключается в следующем:
class Welcome extends CI_Controller{
function home(){
$this->load->view('home');
}
function form()
{
// make the 'quality' field required
$this->form_validation->set_rules('quality', 'Quality', 'required');
// If the fields are NOT filled in...
// or if there isn't a POST! (check the Form_validation.php lib to confirm)
if ( $this->form_validation->run() === FALSE)
{
// This form_error() function actually doesn't do anything if there
// wasn't a form submission (on a GET request)
echo form_error('quality');
$this->load->view('form'); // load or reload the page
}
else // if the fields are filled in...
{
// set success message in flashdata so it can be
// called when page is redirected.
$this->session->set_flashdata('message', 'Your rating has been saved');
redirect('welcome/home','location', 303);
exit;
}
}
тогда в представлении есть форма action="welcome/form"
В основном все функции ошибок формы и все, что связано с проверкой формы, имеют проверки, чтобы проверить, действительно ли выполнялся валидатор формы ... вот пример из функции form_error в файле помощника формы
function form_error($field = '', $prefix = '', $suffix = '')
{
if (FALSE === ($OBJ =& _get_validation_object()))
{
return '';
}
return $OBJ->error($field, $prefix, $suffix);
}
Когда они не POST, они отображаются как обычно и имеют естественный поток страниц, который вы ищете.
Не имеет отношения к вопросу, но сбивает с толку / заслуживает внимания класс проверки формы ... если вы используете фильтры, такие как xss_clean, prep_url и т. Д. В поле параметров, он фактически заполняет для вас массив $ _POST, так что вы не должны не нужно ничего делать.
Иногда стоит взглянуть на внутреннюю часть источника CI, там есть некоторые умные вещи, которые не совсем очевидны.