Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][oop] Architektura aplikacji, grupy/profile i odpowiedne dla nich modele/widoki
jastu
post
Post #1





Grupa: Zarejestrowani
Postów: 382
Pomógł: 0
Dołączył: 29.11.2005
Skąd: :jestem();

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


Witam
problem opiszę na przykładzie :
- mamy w bazie rekord który dla różnych profili użytkownika wyświetla inne kolumny

Gdzie powinno się znaleźć zapytanie o rekord ?
- czy w klasie ModelUserProfil dziedziczącej po klasie ModelUser (chyba nie) ?
( tutaj mamy tylko kod do operacji na danych użytkownika )
- czy w klasie ModelDane która odpowiada za dane które chcemy uzyskać (raczej tak) ?
( wtedy trzeba do ModelDane przekazać informacje o profilu bierzącego użytkownika )
- czy w klasie ViewDane który generuje odpowiedni widok dla bierzącego usera (zdecydowanie tak) ?
( przekazujemy informacje o profilu użytkownika do widoku i na tej podstawie wyświetlamy tylko własciwe dla użytkownika dane, ale pobieramy zawsze komplet danych )

3 rozwiązanie chyba najlepsze, tylko w ModelDane zawsze byśmy pobierali te same dane, a nie każdy profil wymaga pobrania danych dla rekordu z 3 tabel (po np. jeden z profili wymaga danych z jednej tabeli) - co wtedy z wydajnością ?

Jak rozwiązujecie to u siebie ?
pzdr
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
jastu
post
Post #2





Grupa: Zarejestrowani
Postów: 382
Pomógł: 0
Dołączył: 29.11.2005
Skąd: :jestem();

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


Tworzenie DAO dla każdego użytkownika jest chyba najlepszym rozwiazaniem ( wg mnie najbardziej elastycznym w kontekscie zmian ). Rozumiem też, że w tej sytuacji trzeba będzie budować odrębne klasy prezentacji danych ( lub szablony ) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) lub widok generować wspólny, ale każdy przycisk/link/cokolwiek w tym widoku (wywołujący kontroler/metodę/akcję) sprawdzać przed wyświetleniem uwzględniając właśnie uprawnienia użytkownika ... i może to że użytkownik jest jego właścicielem (np ja edytuję swój post więc button edit mi się wyświetli) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?

W tej sytuacji tworzenie odrębnych widoków (bądź jego elementów) wydaje się dobry rozwiązaniem, chociaż wg mnie nie jest to najlepsze rozwiązanie (w przypadku zmian nie jest to już jeden szablon)
  1. <?php
  2. class Fast{
  3.  
  4. static function check($user,$controller,$function,$param){
  5.  // pobranie informacji o wymaganiach żądania (bądź wartości domyślne)
  6. $actionDemand = getActionDemand($controller,$function,$param); 
  7.  
  8. // pobranie uprawnień użytkownika dla tego żądania,(jeśli brak to dane domyślne )
  9. $userPossibility = getUserPossibility($user,$controller,$function,$param);
  10.  
  11.  
  12. // sprawdzenie czy użytkownik może zrealizować ządanie (flagi bitowe)
  13.  ((int)$actionDemand & (int)$userPossibility == $actionDemand) ? return true : return false ;
  14. }
  15. }
  16.  
  17. // i gratis helper do linków :)
  18. function Link($link,$name,$title){
  19. return '<a href= " '.base_url().$link.' "  title= " '$title' " >'.$name.'</a>';
  20. }
  21.  
  22. // wykorzystanie w szablonie 
  23. if(Fast::check($this->User,'post','delete',3)){ echo link('/post/delete/3','Usuń','Usuń tego posta');}
  24. ?>



Skomplikowane moze być pobieranie danych w aspekcie jakiegoś lokalnego wydarzenia zależnego od parametru dla wskazanej funkcji w kontrollerze tzn. jestem moderatorem jakiegoś subforum na forum, i w moim subforum do przycisku usuń_posta uprawnienia mają już trzy osoby (user do swojego posta oraz moderator i administrator do każdego posta)...więc procedura spradzenia czy przycisk usuń_linka może odbiegać od innych.


Obecnie walcze z uzyskaniem zgrabnego rozwiązania dla generowania widoków (zależnych od uprawnień) i dynamicznym przydzielaniem uprawnień .

Wnoisek : mamy dla kontrollera DAO zależne od profilu użytkownika...czy z widokiem zrobić tak samo ?

Poradzicie coś ? (IMG:http://forum.php.pl/style_emoticons/default/aarambo.gif)



////////////////////////////////////////////////////////////////////////////////////////


Pozwolę sobię odświeżyć El Temato (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)
Napisałem klasę wykorzystującą wzorzec Composite View, jest to jedna klasa która przyjmuje tablicę z danymi i nazwę szablonu - po czym podstawia zmienne,wykonuje kod php w szablonie i wyświetla lub przechowuje wynik uruchomienia szablonu.

  1. <?php
  2. // ZAWARTOŚĆ CONTROLLERA
  3.  
  4. $tplName =  'calendar';
  5. $data =  array('poniedziałek','środa','czwartek');
  6. // 3 argument to false tzn.wynik wykanania kodu php w szablonie jest w składowej $calendar_view
  7. $calendar_view = new View($tplName,$data,false);
  8. $banner_view = new View('banner',false,false);
  9.  
  10. $viewElements = array('calendar' => $calendar_view,'banner'=>$banner_view);
  11.  
  12. // wyświetlenie
  13. new View('startPage',$viewElements,true);
  14. ?>


Co zrobić z uprawnieniami do np. opcji w menu dostępnych tylko dla moderatora. Schemat działania widoku jest prosty - przyjmuje on już przygotowane przez kontroler dane....tzn że w kontrolerze zadecydujemy czy button USUŃ ma się wyświetlić bieżącemu userowi ? Kolejnym rozwiązaniem jest przekazanie danych o uprawnieniach do klasy View....tylko wtedy ta klasa powinna mieć możliwość komunikacji z modelem żeby w oparciu o uprawnienia odpowiednie dane pobierać. Czy ktoś potrafi przedstawić wstępny zarys działania takiej implementacji ?

Można...
- napisać 5 różnych szablonów tego samego widoku i ładować odpowiedni w zależności od uprawnień ?

Nie mam już innego pomysłu .....

-------------------------------------------------------------------------
Może się komuś przyda (dla prostych wywołań typu CI czy VFrame) :
- bieżący uzytkownik (zalogowany czy nie) ma jakiś tam profil (administrator/moderator czy Anonymous)
- do szablonu widoku przekazujemy obiekt użytkownika
- zanim wyświetlimy jakiś link lub przycisk sprawdzamy czy user ma uprawnienia do akcji wywoływanej przez ten link
- sprawdzić instancję użytkownika można podczas wywołania kontrollera w jednej z jego metod lub w konstruktorze
KLASA UŻYTKOWNIKA
  1. <?php
  2.  
  3. class User{
  4. private $instance = null;
  5.  
  6. function isAdministrator(){
  7. // sprawdzenie czy user jest administratorem
  8. // return true : false
  9. }
  10.  
  11. function isModerator($id = null){
  12.  // sprawdzenie czy user jest moderatorem czegośtam o wskazanym ID
  13.  // return true : false
  14. }
  15.  
  16. // pozostały kod
  17. }
  18.  
  19. ?>



KONTROLER
  1. <?
  2. class index extends controller{
  3.  
  4. function index(){
  5. $this->load->class('User');
  6. $this->view->display('index',array('user'=>User::init()));
  7.  
  8. }
  9. }
  10. ?>




  1. <html>
  2. <body>
  3. <!-- jakaś treść strony -->
  4. <? php 
  5. <? if( $user->isAdministrator() ) { echo '<a href="www.system.pl/destroy.php">Link</a>' ; } ?>
  6.  
  7.  
  8. </body>
  9. </html>


Czekam na słowa krytyki...

Ten post edytował jastu 23.07.2007, 11:43:34
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 3.10.2025 - 08:27