Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Menu panelu admina - warstwa prezentacji, Kiedy nie wszystkie linki są dostępne dla każdego
WebCM
post 3.07.2013, 18:13:35
Post #1





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


Jest panel admina. Aby uniezależnić warstwę logiki od prezentacji, menu powinno być wyświetlane w szablonach. Jednak nie wszystkie moduły są dostępne dla każdego użytkownika - to zależy od jego uprawnień. Jeśli gdzieś nie ma dostępu, po prostu nie pokazujmy mu linku. Jak to rozwiązać?

1. Sposób. Pozycje zależą od warstwy logiki
Warstwa logiki narzuca budowę menu.

Kod PHP:
  1. #Build module list
  2. $modules = array(
  3. array($lang['cats'], 'cats', 'C'),
  4. array($lang['polls'], 'polls', 'Q'),
  5. array($lang['ipages'], 'pages', 'P'),
  6. array($lang['users'], 'users', 'U'),
  7. array($lang['groups'], 'groups', 'G'),
  8. array($lang['log'], 'log', 'L'),
  9. array($lang['mailing'], 'mailing', 'M'),
  10. array($lang['config'], 'config', 'CFG'),
  11. array($lang['nav'], 'menu', 'N'),
  12. array($lang['dbcopy'], 'db', 'DB'),
  13. array($lang['plugs'], 'plugins', 'E')
  14. );
  15.  
  16. #Pobierz wpisy menu dla rozszerzeń
  17. $res = $db->query('...zapytanie...');
  18. foreach($res as $x)
  19. {
  20. $modules[] = array($x['text'],$x['file'],$x['ID']);
  21. }
  22.  
  23. #Zbuduj menu tak, aby pojawiły się tylko wpisy, do jakich admin ma dostęp
  24. $menu = array();
  25. foreach($modules as $x)
  26. {
  27. if(ma_dostep($x[2])) $menu[] = array('text'=>$x[0],'url'=>url($x[1],null,'admin'),'class'=>$x[1]);
  28. }
  29.  
  30. #Dodaj do szablonu zmienną $menu
  31. $szablon->dodaj('menu', $menu);
Szablon:
  1. <!-- START menu -->
  2. <a href="{url}" class="A{class}">{text}</a>
  3. <!-- STOP -->

+ Po dodaniu lub usunięciu modułu nie trzeba edytować szablonu skórki
+ Można wprowadzić możliwość zmiany kolejności elementów w menu
- Zmiana układu menu jest praktycznie niemożliwa
- W przypadku podziału na bloki wpłynie negatywnie na wydajność

Można posegregować linki w grupy, co ułatwia zmianę układu menu (np. na rozwijane menu), ale wciąż są duże ograniczenia (np. rozwijane menu wielopoziomowe), więcej obliczeń w warstwie logiki i podwójna pętla w szablonie:
  1. <!-- START blok_menu -->
  2. <!-- START link_menu -->
  3. <a href="{url}" class="A{class}">{text}</a>
  4. <!-- STOP -->
  5. <!-- STOP -->

2. Sposób. Wszystko w szablonach.
Nie budujemy menu w warstwie logiki. Wszystkim zajmują się szablony:
  1. <div id="menu">
  2. <!-- IF ma_dostep(C) -->
  3. <a href="url(kategorie)">{lang.kategorie}</a>
  4. <!-- END -->
  5. <!-- IF ma_dostep(G) -->
  6. <a href="url(grupy)">{lang.grupy}</a>
  7. <!-- END -->
  8. <!-- IF link_menu --> <!-- można wcześniej zdefiniować dodatkowe zmienne -->
  9. <a href="{link_menu}">{lang.menu}</a>
  10. <!-- END -->
  11. </div>

+ Można dowolnie zmodyfikować układ menu w szablonie
+ Warstwa logiki nie narzuca nam konkretnego układu i kolejności
- Trudniejsza edycja szablonu - elementy warstwy logiki w szablonie
- Kiedy dodamy lub usuniemy moduł panelu admina, trzeba poprawić szablon wszystkich skórek!

Jak widać, oba rozwiązania mają swoje wady. Które jest najbardziej optymalne i elastyczne według was?


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post
memory
post 3.07.2013, 19:14:47
Post #2





Grupa: Zarejestrowani
Postów: 616
Pomógł: 84
Dołączył: 29.11.2006
Skąd: bełchatów

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


Cytat
- Zmiana układu menu jest praktycznie niemożliwa

Co przez to rozumiesz?
Go to the top of the page
+Quote Post
cim
post 3.07.2013, 22:56:35
Post #3





Grupa: Zarejestrowani
Postów: 208
Pomógł: 28
Dołączył: 9.08.2004
Skąd: Stargard

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


Witam,

ja stosuję oba podejścia, ale w różnych miejscach:
1. dla menu strony do widoku trafia tablica z elementami tylko dla danego użytkownika (dotyczy to aplikacji i autorskiego CMS, który generuje strukturę menu biorąc pod uwagę uprawnienia bieżącego użytkownika; uważam, że wygodniej pobierać częściowo odfiltrowane dane z bazy i obrabiać je w PHP niż w szablonach)
2. dla przycisków na stronie stosuję zmienne z isUprawnienieA, isUprawnienieB,...

Pozdrawiam


--------------------
errare humanum est
Go to the top of the page
+Quote Post
WebCM
post 6.07.2013, 01:47:16
Post #4





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


Cytat(memory @ 3.07.2013, 20:14:47 ) *
Co przez to rozumiesz?

Załóżmy, że zamiast listy chcemy menu rozwijane:

Treść | Społeczność | Pomoc | Ustawienia | Rozszerzenia

Warstwa logiki przekazuje do szablonu tablicę 2D z dostępnymi modułami:

Artykuły | adres do modułu | klasa_art
Galeria | adres do modułu | klasa_gal
...itd...

Nie ma podziału na grupy. Otrzymujemy płaską listę.

Problem można obejść, dzieląc moduły na grupy. Wciąż jest to sztywny podział. Warstwa logiki przekazuje do szablonu tablicę 3D z dostępnymi modułami w oddzielnych grupach.

A teraz w menu rozwijanym chcemy dodać własne linki, np. "Dodaj artykuł". Jedno kliknięcie mniej. Można wstawić go na sztywno, sprawdzić uprawnienia w szablonie, ale zaraz, przecież my wyświetlamy menu w pętli! Poniższy kod tylko wprowadza zamieszanie:
Kod
<!-- IF nazwa_modulu IS "Artykuły" -->link<!-- ELSEIF nazwa_modulu IS "Pliki" -->inny link<!-- END -->

A teraz chcemy zmienić kolejność linków lub wymyślić inny układ. Całkowicie przebudować interfejs. Na nic zda się lista modułów przekazana przez warstwę logiki.


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
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: 19.07.2025 - 06:47