Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [CI] Czy to jest dobre podejście ?
Reptile ReX
post 23.06.2011, 13:16:11
Post #1





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 19.01.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował Reptile ReX 23.06.2011, 13:17:42
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
adbacz
post 23.06.2011, 14:01:40
Post #2





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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

Ten post edytował adbacz 23.06.2011, 14:03:20
Go to the top of the page
+Quote Post
Spawnm
post 23.06.2011, 14:27:34
Post #3





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Takie dane jak $data['error'] = '<p>W bazie danych istnieje już taki użytkownik</p>'; powinieneś dawać w widoku a nie kontrolerze.
Go to the top of the page
+Quote Post
Reptile ReX
post 23.06.2011, 15:23:26
Post #4





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 19.01.2008

Ostrzeżenie: (0%)
-----


@up

Hmm jak tego dokonać?
Go to the top of the page
+Quote Post
adbacz
post 23.06.2011, 15:40:04
Post #5





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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ć.

Ten post edytował adbacz 23.06.2011, 15:42:24
Go to the top of the page
+Quote Post
qrooel
post 23.06.2011, 18:50:56
Post #6





Grupa: Zarejestrowani
Postów: 306
Pomógł: 42
Dołączył: 25.03.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.


--------------------
Strony WWW: http://arscreo.pl
Go to the top of the page
+Quote Post
Spawnm
post 23.06.2011, 22:23:46
Post #7





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Od html jest widok a nie kontroler, po to się stosuje mvc aby był porządek.
Go to the top of the page
+Quote Post
Reptile ReX
post 23.06.2011, 22:51:55
Post #8





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 19.01.2008

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
Spawnm
post 24.06.2011, 10:01:42
Post #9





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Model walidacji zwracający tablicę błędów.
Go to the top of the page
+Quote Post
adbacz
post 24.06.2011, 12:11:14
Post #10





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Reptile ReX
post 24.06.2011, 13:22:39
Post #11





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 19.01.2008

Ostrzeżenie: (0%)
-----


Powiem szczerze, że też o tym pomyślałem.
Go to the top of the page
+Quote Post
szok
post 28.06.2011, 09:20:49
Post #12





Grupa: Zarejestrowani
Postów: 165
Pomógł: 20
Dołączył: 2.03.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:25