Вот некоторые подробности о решении zombat с примерами кода.
У меня обычно есть форма сообщения на тот же контроллер / метод. Затем я позволяю $ this-> form_validation-> run () обрабатывать всю грязную работу. Если присутствуют данные $ _POST, валидатор проверяет правила. Если он проходит, я перенаправляю их на страницу успеха, в противном случае та же страница отображается с ошибками проверки, отображаемыми в заполненной форме.
class Contact extends CI_Controller {
function __construct() {
parent::__construct();
}
function index() {
/*
the foreach() line makes each field visible
to form_validation so we can reliably
repopulate (using set_value, set_checkbox,
etc) fields that have no validation rules
example: since 'phone' has no rules, we would
not be able to repopulate that field if
validation failed
*/
foreach ($_POST as $key => $value) $this->form_validation->set_rules($key, '', '');
$this->form_validation->set_rules('first_name', 'First Name', 'required|min_length[2]');
$this->form_validation->set_rules('last_name', 'Last Name', 'required|min_length[2]');
$this->form_validation->set_rules('email', 'Email Address', 'required|strtolower|valid_email');
if ($this->form_validation->run() == FALSE) {
$this->load->view('contact_form');
} else {
/*
save form data, email it, etc
then redirect the user so they
cannot re-submit the same data
*/
redirect('contact/success');
}
}
function success() {
$this->load->view('contact_success');
}
}
Пример HTML для приложения / views / contact_form.php
<form method="post" action="<?php echo current_url(); ?>">
<table>
<tr>
<td>First Name</td>
<td><?php echo form_input('first_name', set_value('first_name')); ?>
<?php echo form_error('first_name'); ?></td>
</tr>
<tr>
<td>Last Name</td>
<td><?php echo form_input('last_name', set_value('last_name')); ?>
<?php echo form_error('last_name'); ?></td>
</tr>
<tr>
<td>Email Address</td>
<td><?php echo form_input('email', set_value('email')); ?>
<?php echo form_error('email'); ?></td>
</tr>
<tr>
<td>Phone Number</td>
<td><?php echo form_input('phone', set_value('phone')); ?>
<?php echo form_error('phone'); ?></td>
</tr>
<tr>
<td> </td>
<td><button type="submit">Send Message</button></td>
</tr>
</table>
</form>
Я абсолютно не беспокоюсь о том, что CSFR или XSS будут делать это таким образом.
Примечание. Как и в любой общедоступной форме, всегда будут нежелательные материалы (от ботов и реальных людей, пытающихся привлечь бизнес). Если вы столкнулись с большим количеством из них, настройте свои правила проверки соответствующим образом.