Walidacja Formularzy

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":
<?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:
validation->error_string; ?>
$this->validation->error_string zawiera informacje o błędach i jeżeli jakieś istnieją to zostaną wyświetlone.

Reguły walidacji

Zamień nasz kontroler na:
<?php
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:
darmowy hosting obrazków

Opcje walidacji

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

Powtórka - jak zrobić formularz z walidacją danych

- 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
RkBlog

Kurs Code Igniter, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact