Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CI] Czy to jest dobre podejście ?
Forum PHP.pl > Forum > PHP > Frameworki
Reptile ReX
Witam, od wczoraj zaprzyjaźniam się z CI
Widziałem tutaj niezbyt pozytywne opinie na temat tego FW.
Więc zaznaczam, że nie jest to mój wybór, po prostu wymaganie z góry smile.gif.

Chciałbym się zapytać czy mam prawidłowe podejście:

Controller

  1. <?php
  2.  
  3. class Register extends CI_Controller {
  4.  
  5. public function index()
  6. {
  7. $data['title'] = 'Rejestracja';
  8. $data['header'] = 'Rejestracja w systemie';
  9.  
  10. $this->form_validation->set_rules('username', 'Username', 'required|alpha|min_length[3]|xss_clean');
  11. $this->form_validation->set_rules('password', 'Password', 'required|min_length[6]|xss_clean');
  12. $this->form_validation->set_rules('email', 'Email', 'required|valid_email');
  13.  
  14. if ($this->form_validation->run() == false) {
  15.  
  16. $this->load->view('view_register', $data);
  17.  
  18. } else {
  19.  
  20. $this->load->model('Register_model');
  21. $count = $this->Register_model->checkUser($this->input->post('username'));
  22.  
  23. if ($count > 0) {
  24.  
  25. $data['error'] = '<p>W bazie danych istnieje już taki użytkownik</p>';
  26. $this->load->view('view_register', $data);
  27.  
  28. } else {
  29.  
  30. $count = $this->Register_model->checkMail($this->input->post('email'));
  31.  
  32. if ($count > 0) {
  33.  
  34. $data['error'] = '<p>W bazie danych istnieje już użytkownik o takim adresie e-mail</p>';
  35. $this->load->view('view_register', $data);
  36.  
  37. } else {
  38.  
  39. $this->Register_model->addUser();
  40.  
  41. $data['title'] = 'Gratulacje';
  42. $data['header'] = 'Udana rejestracja !';
  43. $data['user'] = $this->input->post('username');
  44.  
  45. $this->load->view('view_result', $data);
  46.  
  47. }
  48.  
  49. }
  50.  
  51. }
  52. }
  53.  
  54.  
  55. }
  56.  
  57. ?>


Model

  1. <?php
  2.  
  3. class Register_model extends CI_Model {
  4.  
  5.  
  6. public function checkUser($username)
  7. {
  8.  
  9. $this->db->select('username');
  10. $this->db->where('username =', $username);
  11. $query = $this->db->get('users');
  12.  
  13. return $query->num_rows();
  14.  
  15. }
  16.  
  17. public function checkMail($mail)
  18. {
  19.  
  20. $this->db->select('email');
  21. $this->db->where('email =', $mail);
  22. $query = $this->db->get('users');
  23.  
  24. return $query->num_rows();
  25.  
  26. }
  27.  
  28. public function addUser()
  29. {
  30. $this->username = $this->input->post('username');
  31. $this->password = md5($this->input->post('password'));
  32. $this->email = $this->input->post('email');
  33.  
  34. $this->db->insert('users', $this);
  35.  
  36. }
  37.  
  38.  
  39.  
  40. }
  41.  
  42. ?>


Views
view_register.php

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  3.  
  4. <head>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6.  
  7. <title><?=$title;?></title>
  8. </head>
  9.  
  10. <body>
  11.  
  12. <h1><?=$header;?></h1>
  13.  
  14. <p>To jest Rejestracja</p>
  15.  
  16. <?=form_open('register');?>
  17.  
  18. Login:<br />
  19. <?=form_input(array('name' => 'username'));?><br /><br />
  20.  
  21. Hasło:<br />
  22. <?=form_password(array('name' => 'password'));?><br /><br />
  23.  
  24. E-mail:<br />
  25. <?=form_input(array('name' => 'email'));?><br /><br />
  26.  
  27. <?=form_submit('register', 'Rejestracja');?>
  28. <?=form_close();?>
  29.  
  30. <?php echo validation_errors(); ?>
  31.  
  32. <?if (isset($error)) {echo($error);}?>
  33.  
  34.  
  35. </body>
  36. </html>


view_result.php

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  3.  
  4. <head>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6.  
  7. <title><?=$title;?></title>
  8. </head>
  9.  
  10. <body>
  11.  
  12. <h1><?=$header;?></h1>
  13.  
  14. Dziękujemy <?=$user?> za rejestrację<br />
  15. Możesz się teraz <?=anchor('login', 'zalogować')?>
  16.  
  17.  
  18. </body>
  19. </html>


Dzięki za góry za wszelkie porady
adbacz
Podejście dobre. Ja nie znam osobiście dobrze tego FW, cały czas się uczę, ale akurat apropo tego mogę conieco napisać.

Po pierwsze, niepotrzebnie sprawdzasz dwa razy bazę danych. Chodzi mi o login i o adres e-mail. Wystarczyło to zrobić jednym zapytaniem (oczywiście w modelu):
  1. $this->db->where('login', $this->input->post('login'));
  2. $this->db->where('email', $this->input->post('email'));


W tedy sprawdzasz instrukcją warunkową czy są rekordy i jeśli tak, to sprawdzasz czy podane dane z $_POST są takie same jak te z bazy. I w tedy już możesz sobie zrobić z danymi co Ci się podoba. Zawsze jedno zapytanie do DB mniej.


Ja na początku do połączeń z bazą danych też korzystałem z wielu różnych modeli i funkcji w nich, ale teraz napisałem sobię jedną bibliotekę, i do funcki w niej zawartych wysyłam wszystkie dane, np: nazwa tabeli, co i wg czego wybierać, ewentualne limit oraz start - zwraca mi tablicę z której sobie wszystko odczytuję jak chcę.

Co do sprawdzania formularza, w instrukcji warunkowej lepiej wpisać
  1. if($this->form_validation->run() == TRUE) {
  2. //jeśli formularz wypełniony dobrze
  3. }
  4. else {
  5. //w innym przypadku
  6. }


Teraz przynajmniej masz pewność, że jeśli coś pójdzie nie tak, to zawsze najpierw sprawdza czy funkcja zwróciła TRUE, jeśli FALSE lub 0 lub cokolwiek innego (wiem, że mało możliwe ale zawsze jakieś zabezpieczenie - warto bo nie są duże zmiany w kodzie) to zrobi to co w else.

PS.
Jeśli odezwie się ktoś wyższy rangą i się przyczepi do tego postu, olej ten post i słuchaj innych, oni pewnie będą mieli lepsze pomysły smile.gif
Spawnm
Takie dane jak $data['error'] = '<p>W bazie danych istnieje już taki użytkownik</p>'; powinieneś dawać w widoku a nie kontrolerze.
Reptile ReX
@up

Hmm jak tego dokonać?
adbacz
Przykładowo dla przykładu na przykład przypisz to tego jakąś wartość, np. boolean FALSE. A w widoku takie coś:
  1. echo ($error == FALSE ? '<p>W bazie danych istnieje już taki użytkownik</p>' : '');

Jeszcze prościej sie chyba nie da napisać.
qrooel
Cytat(Spawnm @ 23.06.2011, 15:27:34 ) *
Takie dane jak $data['error'] = '<p>W bazie danych istnieje już taki użytkownik</p>'; powinieneś dawać w widoku a nie kontrolerze.


Niby dlaczego? Co stoi na przeszkodzie żeby w kontrolerze używać komunikatów? W Ruby on Rails tak się robi np.
Spawnm
Od html jest widok a nie kontroler, po to się stosuje mvc aby był porządek.
Reptile ReX
Zrobiłem to na takiej zasadzie:

Widok:
  1. <?=
  2. (isset($error) == 1) ? '<p>Istnieje już użytkownik z takim nickiem.</p>' :
  3. (isset($error) == 2) ? '<p>Istnieje już użytkownik z takim adresem e-mail.</p>' :
  4. (isset($error) == 3) ? '<p>Podane hasła różnią się od siebie.</p>' : '';
  5. ?>


Ale obawiam się, że przy większych projektach będzie to ciężkie do ogarnięcia, macie jakieś pomysły ?
Spawnm
Model walidacji zwracający tablicę błędów.
adbacz
Faktycznie, trochę mieszania by było w taki sposób. Ale wpadłem na coś takiego. Czy nie lepiej robić te błędy standardowo w controlerze ale pobierać informacje o tych błędach z plików językowych?

Ja osobiście robiąć rejestrację właśnie podczas sprawdzania wprowadzonych danych sam zrobiłem jak autor tematu, że informacje o błędach były zawarte w kontrolerze i dopiero po weryfikacji, gdy nastąpił błąd wysyłane do widoku. Może to nie jest elegancki sposób ale nie trzeba bawić się właśnie w te modele validacji jak napisał mod. i nie ma tyle kodu do sprawdzania czy zmienna istnieje.

Można też inaczej, sklejać wszystko do jednej zmiennej. Jeśli wystąpi błąd to przypisać do zmiennej, jeśli jeszcze jeden, dokleić do poprzedniego i w widoku wyświetlać sklejone informacje z kontrolera.

Co panowie 'starsi rangą' myślą o tych plikach językowych?
Reptile ReX
Powiem szczerze, że też o tym pomyślałem.
szok
Nie prościej sobie napisać helper do generowania błędów?

Ogólnie lepsza metoda jest dopisanie dodatkowego funkcji do walidacji formularza.

http://codeigniter.com/user_guide/librarie....html#callbacks

I kłopot z głowy smile.gif
A żeby widok był widokiem to błędy dać do pakietów językowych
I potem ładnie koło pola form_error('pole'); i problem z głowy
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.