Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [AJAX][PHP] Formularz z AJAX - zgodnie z MVC.
Damonsson
post 24.10.2012, 18:21:38
Post #1





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Mam taką zagwozdkę: zrobiłem formularz sprawdzający czy dany login już istnieje w bazie danych i wyświetlający informację na bieżąco po wprowadzeniu znaku (keyup).


AJAXem wysyłam posta do kontrolera url: "register/checkLogin",
[JAVASCRIPT] pobierz, plaintext
  1. $(function()
  2. {
  3. $('#username').keyup(function() {
  4. $("#status").html('<img src="public/img/ajax-loader.gif">&nbsp;Sprawdzanie dostępności.');
  5. clearTimeout($.data(this, 'timer'));
  6. var wait = setTimeout(search, 600);
  7. $(this).data('timer', wait);
  8. });
  9.  
  10. function search() {
  11.  
  12. var username = $("#username").val();
  13. var msgbox = $("#status");
  14.  
  15. if(username.length > 4)
  16. {
  17. $("#status").html('Sprawdzanie dostępności.');
  18. $.ajax({
  19. type: "POST",
  20. url: "register/checkLogin",
  21. data: "username="+ username,
  22. success: function(msg){
  23. $("#status").ajaxComplete(function(event, request){
  24. if(msg == 'OK')
  25. {
  26. $("#username").removeClass("red");
  27. $("#username").addClass("green");
  28. msgbox.html('<img src="yes.png"> <font color="Green"> Dostępny</font>');
  29. }
  30. else
  31. {
  32. $("#username").removeClass("green");
  33. $("#username").addClass("red");
  34. msgbox.html(msg);
  35. }
  36. });
  37. }
  38. });
  39.  
  40. }
  41. else
  42. {
  43. $("#username").addClass("red");
  44. $("#status").html('<font color="#cc0000">Za mało znaków</font>');
  45. }
  46. return false;
  47. }
  48. });
[JAVASCRIPT] pobierz, plaintext


W kontrolerze mam funkcję:
  1. public function checkLogin() {
  2. $data = array(
  3. 'login' => $_POST['username']
  4. );
  5. $this->model->checkLogin($data);
  6.  
  7. }


W modelu:
  1. public function checkLogin($data) {
  2. if (isset($data['login'])) {
  3. $sth = $this->db->selectOne('SELECT userId FROM user WHERE login = :login', array(
  4. ':login' => $data['login']
  5. ));
  6. if ($sth) {
  7. echo '<span style="color: #cc0000;"><strong>' . $data['login'] . '</strong> jest już zajęty.</span>';
  8. } else {
  9. echo 'OK';
  10. }
  11. }
  12. }

W modelu wywołując print_r($sth) daje taki efekt dla zajętego loginu: Array ( [userId] => 6 ). Dla wolnego nie zwraca nic.

Nie podoba mi się, że w modelu mam umieszczony ten fragment:
  1. if ($sth) {
  2. echo '<span style="color: #cc0000;"><strong>' . $data['login'] . '</strong> jest już zajęty.</span>';
  3. } else {
  4. echo 'OK';
  5. }


Tylko nie wiem gdzie mam go wrzucić i jak przekazać odpowiednio? Do widoku? Do kontrolera? Czy może, wcale to nie jest złe i powinno być to w modelu?

W widoku mam jedynie
  1. <input id="username" name="username" type="text" /> <span id="status"> </span>


Gdyby mógł ktoś rzucić okiem i fachowo mnie oświecić jak to powinno się zrobić należycie, byłbym niezmiernie wdzięczny.
Go to the top of the page
+Quote Post
Spawnm
post 24.10.2012, 18:29:20
Post #2





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




zwracaj 0/1 i w js generuj html.
Go to the top of the page
+Quote Post
Sebek87
post 24.10.2012, 18:50:04
Post #3





Grupa: Zarejestrowani
Postów: 74
Pomógł: 24
Dołączył: 21.10.2012
Skąd: Puławy

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


Ja proponuję string wyświetlać w kontrolerze. W modelu zwróć sobie boolean, a w kontrolerze np. echo 'true/false' i gitara.
Go to the top of the page
+Quote Post
abort
post 24.10.2012, 20:58:14
Post #4





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


Pomiń zwracanie tego HTMLa (w zamian dodawaj go w jQ), zostaw tylko zwracanie "OK". Lub tak jak napisał Spawnm, zwracaj bool 0/1 - ale tak czy inaczej kod HTML dodałbym do jQuery.
Go to the top of the page
+Quote Post
markonix
post 24.10.2012, 23:31:07
Post #5





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Model koniecznie powinien zwracać true / false, aby zachować jego uniwersalność - przecież możemy go wykorzystywać w różnych kontekstach, nie tylko ajaxowym.
Potem gdybyśmy chcieli zachować taką uniwersalność dla kontrolera to można się pokusić o sprawdzenie czy request jest ajaxowy.
Zwykle w FW jest coś w stylu $this->request->isAjax().
Jeśli ajax dajesz echo albo json_encode(array('status' => $status)).
Jeśli nie ajax to po prostu return $status.

Ten post edytował markonix 24.10.2012, 23:31:25


--------------------
Go to the top of the page
+Quote Post
Damonsson
post 25.10.2012, 14:01:32
Post #6





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Dzięki wszystkim, ale w szczególności @markonix, o to mi chodziło, teraz jest git.

w .js dałem
[JAVASCRIPT] pobierz, plaintext
  1. if(check == 'false')
  2. {
  3. bla bla HTML
  4. }
  5. else
  6. {
  7. bla bla 2. HTML
  8. }
[JAVASCRIPT] pobierz, plaintext


a w modelu

  1. public function checkLogin($data) {
  2. if (isset($data['login'])) {
  3. $check = $this->db->selectOne('SELECT userId FROM user WHERE login = :login', array(
  4. ':login' => $data['login']
  5. ));
  6. echo json_encode($check);
  7. }
  8. }
Go to the top of the page
+Quote Post
Spawnm
post 25.10.2012, 15:03:58
Post #7





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




Ale czemu model zwraca jsona i czemu dajesz echo w modelu!? Niech zwraca boola, będziesz mógł wykorzystać w różnych przypadkach.
Go to the top of the page
+Quote Post
Damonsson
post 25.10.2012, 16:30:48
Post #8





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Chodzi Ci o coś takiego?
  1. public function checkLogin($data) {
  2.  
  3. if (isset($data['login'])) {
  4.  
  5. $check = $this->db->selectOne('SELECT userId FROM user WHERE login = :login', array(
  6.  
  7. ':login' => $data['login']
  8.  
  9. ));
  10.  
  11. if ($check) {
  12. $status = FALSE;
  13. } else {
  14. $status = TRUE;
  15. }
  16.  
  17. }
  18.  
  19. }

Tylko jak mam później to przekazać do skryptu .js w widoku? Muszę to jakoś "wyeksportować" do widoku przecież. A nie mogę, bo nie generuję oddzielnego widoku dla checkLogin, bo i po co, Gubię się z tym AJAXem ;/



Jak mam normalnie np. pobieranie tam wszystkich rekordów to robię tak:

w kontrolerze generuję widok:
  1. public function index() {
  2. $this->view->noteList = $this->model->noteSelectAll();
  3. $this->view->render('note/index');
  4. }


W modelu zwracam:
  1. public function noteSelectAll() {
  2. return $this->db->selectAll("SELECT * FROM note WHERE id = :id", array('id' => $_SESSION['userId']));
  3. }


no i w widoku przykładowo wyświetlam tak
  1. foreach ($this->noteList as $key => $value) {
  2. echo '<tr>';
  3. echo '<td>' . $value['title'] . '</td>';
  4. echo '<td>' . $value['content'] . '</td>';
  5. echo '<td>' . $value['date_add'] . '</td>';
  6. echo '</tr>';
  7. }
  8. ?>

Go to the top of the page
+Quote Post
markonix
post 26.10.2012, 13:30:17
Post #9





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


  1. if ($check) {
  2. $status = FALSE;
  3. } else {
  4. $status = TRUE;
  5. }


  1. if ($check)
  2. return false;
  3. return true;


Albo jeszcze lepiej to się pewnie da zapisać zwracając wynik metody selectOne rzutowanej na boolean (tylko nie mam pewności co ta metoda normalnie zwraca).

Gdy masz już model - czyli metodę to przechodzimy do ajax.
W ajax wywołujesz URL twoja-strona.pl/klasa/metoda/ (w zależności od FW różnie to wygląda) przesyłając login.
Kontroler wywołuje metodę z modelu z odpowiednim argumentem zawierającym login.
Model zwraca true / false.
Kontroler odbiera informacje i zwraca JSON w przypadku gdy jest to request ajaxowy.
jQuery odbiera JSON z informacją i aktualizuje odpowiednio informacje przy formularzu.

Ten post edytował markonix 26.10.2012, 13:31:10


--------------------
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: 31.05.2024 - 13:40