CI posiada oprócz pomocnika generującego formularze klasę, która sprawdza dane (waliduje je). By ją załadować (najlepiej globalnie) wystarczy dodać w
config/autoload.php nazwę klasy:
$autoload['libraries'] = array('validation');
Teraz możemy dodać walidację danych naszego formularza. Tworzymy kontroler "formularz.php":
class Formularz extends Controller
{
function index()
{
// dane poszczególnych pól w postaci tablicy
$data["tytul"] = array('name' => 'tytul');
$data['tresc'] = array('name' => 'tresc', 'rows' => 3, 'cols' => 40);
if ($this->validation->run() == FALSE)
{
$data['tytul']['value'] = $this->input->post('tytul');
$data['tresc']['value'] = $this->input->post('tresc');
$this->load->view('form', $data);
}
else
{
// przypisanie danych z formularza
// wyświetlenie wyników
$news['tytul'] = $this->input->post('tytul');
$news['tresc'] = $this->input->post('tresc');
$this->load->view('wynik', $news);
}
}
}
Widok z formularzem, "form.php":
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>Dodaj news</h1>
<center><?=$this->validation->error_string; ?></center>
<?php echo form_open('formularz'); ?>
<p><label for="tytul">Tytuł: </label><br /><?php echo form_input($tytul); ?></p>
<p><label for="tresc">Treść: </label><br /><?php echo form_textarea($tresc); ?></p>
<?php echo form_submit('submit', 'Zapisz'); ?>
<?php echo form_close(); ?>
</body>
</html>
Oraz widok "wynik.php" na wyniki:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<?PHP
echo '<B>Tytuł</B> '.$tytul;
echo '<BR /><B>Treść</B> '.$tresc;
?></body></html>
Teraz wejście na
index.php/formularz wyświetli formularz, który po wysłaniu tylko się przeładuje. Dlaczego? Gdyż nie podaliśmy warunków walidacji danych - tj. jakie warunki muszą spełniać nadesłane dane. Korzystając z klasy walidacji musimy określić przynajmniej jedną regułę. Ale o tym za chwilę. Przyjrzyjmy się kodowi powyżej.
Kontroler w metodzie
index zawiera
if ($this->validation->run() == FALSE)
Otóż metoda
$this->validation->run() zwróci "True" jeżeli wszystkie reguły zostaną spełnione, a "False" jeżeli chodziaż jedna nie zostanie spełniona. Czyli jeżeli zwróci "True" to oznacza poprawnie wypełniony formularz - dane mogą być dale wykorzystane. Jeżeli zwróciło "False" to oznacza że coś jest nie tak jak powinno. Wtedy warto ponownie wyświetlić formularz i kazać poprawić błędy. I tak właśnie czynimy, z tym że dodaliśmy:
$data['tytul']['value'] = $this->input->post('tytul');
$data['tresc']['value'] = $this->input->post('tresc');
Dane pól są w tablicy
$data. Dane danego pola są pod
$data['nazwapola'] a
$data['nazwapola']['value'] oznacza ustawienie wartości "value" dla podanego pola. Te sprytne dwie linijki ustawią "domyślną" wartość pól na tą z wysłanego formularza (jeżeli formularz nie został wysłany lub pola były puste to i wartość "value" będzie pusta). Efekt jest taki że przy błędnym wypełnieniu formularza dane nie zginął.
W widoku
form.php pojawiła się nowa linijka kodu:
=$this->validation->error_string; ?>
$this->validation->error_string zawiera informacje o błędach i jeżeli jakieś istnieją to zostaną wyświetlone.
Zamień nasz
kontroler na:
class Formularz extends Controller
{
function index()
{
$data["tytul"] = array('name' => 'tytul');
$data['tresc'] = array('name' => 'tresc', 'rows' => 3, 'cols' => 40);
$rules['tytul'] = "required";
$rules['tresc'] = "required";
$this->validation->set_rules($rules);
if ($this->validation->run() == FALSE)
{
$data['tytul']['value'] = $this->input->post('tytul');
$data['tresc']['value'] = $this->input->post('tresc');
$this->load->view('form', $data);
}
else
{
$news['tytul'] = $this->input->post('tytul');
$news['tresc'] = $this->input->post('tresc');
$this->load->view('wynik', $news);
}
}
}
Pojawiły się trzy nowe wiersze.
$rules['NAZWAPOLA'] = "opcje"; ustawia opcje sprawdzania dla danego pola.
$this->validation->set_rules($tablica opcji); ładuje stworzoną tablicę z opcjami. Teraz wysłanie formularza skończy się sukcesem gdy oba pola będą wypełnione. Spróbuj wysłać formularz z pustym polem. Zobaczysz coś takiego:
required: pole jest wymagane, musi mieć jakąś wartość.
valid_email: pole musi zawierać poprawny adres email
numeric: pole musi zawierać same liczby
alpha_dash: pole może zawierać jedynie znaki alfanumeryczne, podkreślenia i myślniki
alpha_numeric: pole może zawierać jedynie znaki alfanumeryczne
alpha: pole może zawierać jedynie litery
exact_length[*]: wartość pola musi mieć określoną długość
exact_length[6] - 6 znaków
max_length[*], min_length[*]: wartość pola musi mieć maksymalnie/minimalnie * znaków.
Opcje można łączyć, o tak:
$rules['username'] = "required|min_length[5]|max_length[12]";
Dodatkowo do tych parametrów możemy dodać:
xss_clean: oczyszcza dane ze "złośliwego" kodu (ataki XSS)
prep_for_form: zamienia znaki HTML na znaki specjalne przez co można je wyświetlać bez problemu w formularzach
prep_url: doda http:// do linków jeżeli brakuje
strip_image_tags: usunie tagi IMG zostawiając czyste linki URI
- Załadować klasę "validation"
- Stworzyć zwykły formularz, najlepiej tak jak zaprezentowano w tym warsztacie (tablica określająca dane pola przekazywana z widoku)
- Umieścić w nim zmienną wyświetlającą informacje o błędach (
$this->validation->error_string)
- Stworzyć kontroler z instrukcją warunkową opartą o
$this->validation->run()
- Dodać opcje walidacji