Dwa widoki na jeden kontroler.

0

Mam dwa widoki:

  1. panel logowania użytkownika

    • pobiera login i hasło od użytkownika
    • tutaj znajduje się przycisk logowania
  2. profil użytkownika

    • wyświetla pewne dane użytkownika
    • tutaj znajduje się przycisk wylogowania

W momencie zalogowania na miejscu widoku
panelu powinien pojawić się widok profilu,
analogiczna sytuacja z wylogowaniem.

Moim zdaniem potrzebny jest jeden model,
udostępniający interfejs akcji logowania
i wylogowania oraz jeden kontroler
sterujący tymi dwiema akcjami
i zmieniający widoki po poprawnym ich
wykonaniu.

Pytanie. Jak to rozwiązać ? Mój pomysł
polega na tym, aby wrzucić te dwa widoki
do jednego wspólnego. Wspólny widok
udostępniałby interfejs dla kontrolera
służący zamianie widoków. Oczywiście
wspólny widok przekazałbym kontrolerowi.
Tylko przy takim rozwiązaniu komunikacji
pod-widoków z kontrolerem musiałby
towarzyszyć wspólny widok(?).

0

Cześć t0m_k,
nic nie stoi na przeszkodzie aby Twój model udostępniał metode informującą o tym jaki jest aktualny stan autoryzacji użytkownika (zalogowany/niezalogowany).
Na tej podstawie kontroler może zadecydować który widok uruchomić.

0

Dzięki za odpowiedź.

piochu napisał(a)

nic nie stoi na przeszkodzie aby Twój model udostępniał metode informującą o tym jaki jest aktualny stan autoryzacji użytkownika (zalogowany/niezalogowany). Na tej podstawie kontroler może zadecydować który widok uruchomić.

Tak, tylko chodzi mi o sposób komunikacji pod-widoków z kontrolerem, ponieważ to pod-widoki muszą zażądać wykonania akcji od kontrolera połączonego ze wspólnym widokiem w momencie naciśnięcia przycisku przez użytkownika. Nie wiem, czy komunikować się za pośrednictwem wspólnego widoku, czy dać po prostu pod-widokom referencje/wskaźnik do tego kontrolera - czy to będzie zgodne z mvc, czy może inne rozwiązanie powinno być tu zastosowane ?

0
t0m_k napisał(a)

[...] ponieważ to pod-widoki muszą zażądać wykonania akcji od kontrolera połączonego ze wspólnym widokiem w momencie naciśnięcia przycisku przez użytkownika.

Nie, w taki przypadku to nie MVC.

(jeśli mówie rzeczy oczywiste to sorry :P)
Standardowo MVC zachowuje się w taki sposób, że to kontroler na podstawie danych wejściowych decyduje jaki widok odpalić i jaki model z nim skojarzyć. Czyli w Twoim przypadku wyglądało by to tak: od użytkownika przychodzą dane do autoryzacji, kontroler wykrywa to i przekazuje dane do modelu, który autoryzuje użytkownika. Jeśli logowanie powiedzie się (np. metoda odpowiedzialna za sprawdzenie stanu autoryzacji zwróci TRUE) kontroler odpala widok, który wyświetla panel usera. Jeśli formularz logowania nie został wypełniony lub logowanie nie powiodło się kontroler uruchamia widok panelu logowania.

Więcej szczegółów znajdziesz tutaj: http://www.zyxist.com/pokaz.php/poeksperymentujmy_z_mvc

0

Od użytkownika przychodzą dane do autoryzacji, ale u mnie te dane zostają w buforach kontrolek, do których zostały wpisane, więc widok sam je przesyła do kontrolera i dlatego mam problem z komunikacją między pod-widokami(panelu logowania, profilu), a kontrolerem, ponieważ nie wiem czy mogę połączyć bezpośrednio kontroler z pod-widokami(pod-widoki trzymają referencje do kontrolera, a kontroler referencje do wspólnego widoku, udostępniającego interfejs zamiany widoku w razie zalogowania i wylogowania). Wychodzi na to, że jeśli chcę aby było zgodnie z mvc to muszę zaimplementować automatyczne wykrywanie przez kontroler danych wejściowych, bo pogubiłem się w Twojej odpowiedzi ?

1

ahh, ja cały czas mówiłem o pasywnym MVC (czyli np. wtedy gdy mamy do czynienia z zwykłą stroną, która przeładowuje się w całości przy przesyłaniu formularza).

Moim zdaniem możesz je połączyć w ten sposób (pod-widoki bezpośrednio z kontrolerem), ponieważ jeśli dobrze rozumiem to komunikacja przebiegała by w taki sposób:

kontrolki znajdujące się w pod-widokach reagują na wpisane dane i przesyłają dane do kontrolera -> kontroler odbiera dane i przez interfejs, który udostępnia mu główny widok informuje go o potrzebie podmiany czegoś tam

tak?

0
piochu napisał(a)

kontrolki znajdujące się w pod-widokach reagują na wpisane dane i przesyłają dane do kontrolera -> kontroler odbiera dane i przez interfejs, który udostępnia mu główny widok informuje go o potrzebie podmiany czegoś tam

tak?

Tak to miałem na myśli :)

edit: Aha, czyli wszystko będzie w harmonii z mvc, jeśli połącze bezpośrednio. Dzięki wielkie za pomoc.

0

Myślę, że tak bo pchanie tego przez jeszcze jeden widok było by bez sensu (tworzymy dodatkową warstwe ale w zasadzie nie wiadomo po co).
Gdy połączysz to bezpośrednio całość będzie się zachowywała tak jak przy wykorzystaniu obserwatora czyli z pasywnego MVC przechodzimy na aktywny i gra gitara :).

0
piochu napisał(a)

Myślę, że tak bo pchanie tego przez jeszcze jeden widok było by bez sensu (tworzymy dodatkową warstwe ale w zasadzie nie wiadomo po co).

No właśnie trochę to głupie by było, ale z drugiej strony nie wiedziałem, czy przypadkiem nie wyłamuję się z ogólnej architektury mvc ładując uchwyty do kontrolera widokom, z którymi tak na prawdę komunikacji kontroler->pod-widok nie ma, bo to pod-widoki tutaj wysyłają dane do kontrolera, a on tylko zmienia pod-widoki za pomocą wspólnego widoku, stąd propozycja na początku dodatkowego obciążenia wspólnego widoku pośrednictwem w komunikacji.

W każdym razie dzięki jeszcze raz :)

0

Przyklad z mojego fw:

<?php

class Auth extends Controller implements IController {

  private $AuthModel;
  
  private $validation;

  public function __construct() {

     parent::__construct();
	 $this -> AuthModel = $this -> Auth_Model;
	 $this -> validation = $this -> Validation;

  }


  public function Index() { 
	 
	 if($this -> AuthModel -> Authorization -> isLogged()) {

             return $this -> Forward('Profile');
	 
	 }
	 
	 else {
	 
             $user = $this -> auth -> GetUserType();
	     return $this -> view -> Layout('component', 'Auth', 'Auth', $user);
			 
	}
  
  }
  
  
  public function Auth() { 
   
   if($this -> validation -> Submitted('log')) {
   
     $this -> inputfilter -> Filter();
	 
	 $this -> validation -> AddRules('login', 'Login', 'required');
	 $this -> validation -> AddRules('password', 'Haslo', 'required');
	 $this -> validation -> AddRules('login', 'Login', 'AlphaDigit');
	 $this -> validation -> AddRules('password', 'Haslo', 'AlphaDigit');
	 
	 $this -> validation -> Validation();
	 
	 $errors = $this -> validation -> getValidationErrors();
   
      if(empty($errors)) {
   
        if($this -> AuthModel -> Login($_POST['login'], $_POST['password'])) {
   
	        $this -> Redirect('/index.php');
		
       }
	   
	 }
   
     else {
   
	 $this -> view -> AddVar('error', $errors);
   
     }
   
   }  
   
   $user = $this -> auth -> GetUserType();
   return $this -> view -> Layout('component', 'Auth', 'Auth', $user);
	   
  }
  
  
  public function Logout() {
  
    if($this -> auth -> isLogged()) {
	
	    $this -> auth -> LogOut();
	    $this -> Redirect('/index.php');
		
     }
  }
}
 
0

@marcio: Dzięki za kod, ale.. mvc potrzebuję tylko do oddzielenie warstw w każdym z modułów, które mam - nie potrzebuję żadnych bajerów typu walidator danych wejściowych. Jeśli chodzi o przykłady jak wygląda ogólnie mvc to opieram się na tym http://csis.pace.edu/~bergin/mvc/mvcgui.html oraz na tym http://www.phppatterns.com/docs/design/archive/model_view_controller_pattern i na tym http://upload.wikimedia.org/wikipedia/commons/9/9b/Mvc_classes_pl.svg. W każdym razie mniej więcej z samym mvc wiem o co chodzi, ale brakuje mi teorii, więc jeśli moglibyście polecić jakąś książkę, najlepiej w całości poświęconą mvc to byłbym wdzięczny za podanie tytułu w komentarzu, żeby offtopa nie robić :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1